ChatGPT解决这个技术问题 Extra ChatGPT

Getting Unexpected Token Export

I am trying to run some ES6 code in my project but I am getting an unexpected token export error.

export class MyClass {
  constructor() {
    console.log("es6");
  }
}
there is not enough information about your environment or configuration to offer any assistance. This error is suggesting that either webpack or babel are not working correctly, as export is only available in ES6, and those modules are what provide ES6 support.
You should use module.exports = MyClass, not export class MyClass
If you're running this in Node > 12, rename the file to myFile.mjs. That mjs extension should tell Node you're using ES6 Module syntax.

P
Phil Ricketts

Updated for 2022

You are using ES6 Module syntax.

This means your environment (e.g. node v14.13.0 or newer) must support ESM (Ecmascript Module Syntax).

NodeJS since v14.13.0 supports EcmaScript Module Syntax but it must be enabled by adding the property "type":"module" to package.json. NodeJS versions prior to v14.13.0 uses CommonJS Module syntax by default (module.exports), not ES6 module syntax (export keyword).

Solutions:

Enable module support in package.json as outlined above, if

Refactor with CommonJS syntax (for older versions of NodeJS)

Accept that TypeScript is just better and write .ts files along with ts-node or ts-node-dev npm package

(deprecated) Use babel npm package to transpile your ES6 to a commonjs target

Javascript Module standards have changed a lot in recent years, so it can be a bit confusing.


When will nodejs support import natively? I thought v10.0.0 would have it but apparently not.
@chovy experimental support is available with flag "--experimental-modules". Files needs to have a .mjs extension
I'm getting this error using Chrome 66 with native support for modules.
For someone are still not clear about CommonJs Syntax. please checkout this link, may help a little bit. flaviocopes.com/commonjs
Not really a helpful comment, but for someone outside of the front-end world it is all quite confusing. Just wanted to build a module used for web, which I am testing in the CLI. I would've assumed that Node.js being mature environment would support ES6 syntax out of the box.
P
Pang

In case you get this error, it might also be related to how you included the JavaScript file into your html page. When loading modules, you have to explicitly declare those files as such. Here's an example:

//module.js:
function foo(){
   return "foo";
}

var bar = "bar";

export { foo, bar };

When you include the script like this:

<script src="module.js"></script>

You will get the error:

Uncaught SyntaxError: Unexpected token export

You need to include the file with a type attribute set to "module":

<script type="module" src="module.js"></script>

then it should work as expected and you are ready to import your module in another module:

import { foo, bar } from  "./module.js";

console.log( foo() );
console.log( bar );

unlike the "most-upvoted" answer, this actually solves the problem and explains why it is happening without suggesting that the only option is to leverage a CommonJS method, APM method, or to transpile our code... This would also be an exception to the w3c standard where type is expected to be a valid mime type (aka. media type), so this was an unexpected find. Thanks!
This fixes the error but I then get "Unexpected token {" on the line of the import statement in Chrome 67 with script that is inline eg
@PandaWood You have to use <script type="module">import ...</script>, when you import from module. I tested it in recent version of Chromium.
I just want to mention when using expert default you are not intended to put the same name, on the other hand export only you must follow same name for function, object ..etc In addition to that, you should import with .js as suffix
How do you use the import ... when loading a script from an external site such as jsDelivr?
B
Barnstokkr

My two cents

Export

ES6

myClass.js

export class MyClass1 {
}
export class MyClass2 {
}

other.js

import { MyClass1, MyClass2 } from './myClass';

CommonJS Alternative

myClass.js

class MyClass1 {
}
class MyClass2 {
}
module.exports = { MyClass1, MyClass2 }
// or
// exports = { MyClass1, MyClass2 };

other.js

const { MyClass1, MyClass2 } = require('./myClass');

Export Default

ES6

myClass.js

export default class MyClass {
}

other.js

import MyClass from './myClass';

CommonJS Alternative

myClass.js

module.exports = class MyClass1 {
}

other.js

const MyClass = require('./myClass');

Hope this helps


Thanks! This really helped me understand the difference between ES6 and CommonJS import/export patterns.
m
mattdlockyer

I fixed this by making an entry point file like.

// index.js
require = require('esm')(module)
module.exports = require('./app.js')

and any file I imported inside app.js and beyond worked with imports/exports now you just run it like node index.js

Note: if app.js uses export default, this becomes require('./app.js').default when using the entry point file.


Best answer for simple projects not needing babel, webpack, parcel etc... I used in monorepo project with simple /server express for project. Worked like a charm...
Very good answer. In this way, many different module files in my project can be closely linked. And the way is so simple!
This answer saved me, really. There are so many complicated or wrong answers about this out there that I just can't believe it.
This should be the accepted answer. Thank you!
Thanks. A most simple and helpful answer!
A
Alvin Konda

There is no need to use Babel at this moment (JS has become very powerful) when you can simply use the default JavaScript module exports. Check full tutorial

Message.js

module.exports = 'Hello world';

app.js

var msg = require('./Messages.js');

console.log(msg); // Hello World

Well how would you export a class then?
@SherwinAblañaDapito module.exports = class MyClass {} works
the tutorial you mentioned is about NodeJS not Javascript (vanilla)
J
Jalal

To use ES6 add babel-preset-env

and in your .babelrc:

{
  "presets": ["@babel/preset-env"]
}

Answer updated thanks to @ghanbari comment to apply babel 7.


@monsto this question was already tagged babel by the author. Whilst Phil Ricketts answer does clarify the problem, which is good, this answer is a direct solution to the author's problem.
"@babel/preset-env"
Y
YouBee

Install the babel packages @babel/core and @babel/preset which will convert ES6 to a commonjs target as node js doesn't understand ES6 targets directly

npm install --save-dev @babel/core @babel/preset-env

Then you need to create one configuration file with name .babelrc in your project's root directory and add this code there.

{ "presets": ["@babel/preset-env"] }


I also needed to install @babel/register, otherwise I would still get "SyntaxError: Cannot use import statement outside a module"
i'm grateful that someone actually mentioned how you could make it compatible with es6 in this q&a thread! jeez.
P
Paramsmit Sanghani

I got the unexpected token export error also when I was trying to import a local javascript module in my project. I solved it by declaring a type as a module when adding a script tag in my index.html file.

<script src = "./path/to/the/module/" type = "module"></script>


C
C B

In the latest versions of Nodejs (v17?) you can use top-level "import", "async", "await" by using the .mjs file extension - instead of transpiling or workarounds.

   // > node my.mjs
   
   import {MyClass} from 'https://someurl'
   async func () {
     // return some promise
   }
   await func ()

T
Thomas Andrews

I had modules working for a while, and then they weren't with this Uncaught SyntaxError: Unexpected token export error.

Turns out, I had added an open brace without a closed brace. Something like:

if (true) {
export function foo() {}

While the big error is the forgetting of the end }, the parser first finds an export inside the brace, which is a no-no.

The export keyword must be in the top level of the file.

So:

if (true) {
    export function foo() {}
}

would also be illegal. When the parser encounters this, it stops parsing right there, announcing the misuse of export vaguely, giving the same error it gives when it is loading a "non-module" JavaScript file that uses the export keyword. It never reports the underlying missing brace error.

Took me a long time to figure that out, so I'm posting here to help any future sufferers.

Ideally, the parser would report that export is only allowed at the top level of the file.


p
purushottam banerjee

Using ES6 syntax does not work in node, unfortunately, you have to have babel apparently to make the compiler understand syntax such as export or import.

npm install babel-cli --save

Now we need to create a .babelrc file, in the babelrc file, we’ll set babel to use the es2015 preset we installed as its preset when compiling to ES5.

At the root of our app, we’ll create a .babelrc file. $ npm install babel-preset-es2015 --save

At the root of our app, we’ll create a .babelrc file.

{  "presets": ["es2015"] }

Hope it works ... :)


b
badasscoder

I actually want to add simple solution. use constand backticks(`).

const model = `<script type="module" src="/"></<script>`