我不明白是怎么回事。 节点v5.6.0 NPM v3.10.6

代码:

function (exports, require, module, __filename, __dirname) {
    import express from 'express'
};

错误:

SyntaxError: Unexpected token import
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:387:25)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Function.Module.runMain (module.js:447:10)
    at startup (node.js:140:18)
    at node.js:1001:3

当前回答

我一直想把它修好。以下是有效的方法:

使用最新的节点版本。我使用的是v14.15.5。运行:node——version来验证你的版本 命名文件,使它们都以.mjs而不是.js结尾


例子:

mod.mjs

export const STR = 'Hello World'

test.mjs

import {STR} from './mod.mjs'
console.log(STR)

执行命令node test.mjs

你应该看到“Hello World”。

其他回答

我要在最初的问题中解决另一个问题,没有人问过这个问题。最近在我自己的NodeJS项目中从CommonJS转换到ESM后,我很少看到关于你不能像require那样把导入放在你想要的任何地方的讨论。我的项目现在使用导入工作得很好,但是当我使用问题中的代码时,我首先得到一个没有命名函数的错误。命名函数后,我收到以下…

import express from 'express'
       ^^^^^^^

SyntaxError: Unexpected identifier
    at Loader.moduleStrategy (internal/modules/esm/translators.js:88:18)

您不能像需要的那样在函数中导入。它们必须放在文件的顶部,在代码块之外。我自己在这个问题上也浪费了不少时间。

因此,虽然上面所有的答案都能很好地帮助您在项目中导入,但没有一个能解决原始问题中的代码不能像编写的那样工作的问题。

我一直想把它修好。以下是有效的方法:

使用最新的节点版本。我使用的是v14.15.5。运行:node——version来验证你的版本 命名文件,使它们都以.mjs而不是.js结尾


例子:

mod.mjs

export const STR = 'Hello World'

test.mjs

import {STR} from './mod.mjs'
console.log(STR)

执行命令node test.mjs

你应该看到“Hello World”。

巴别塔7号提案 您可以添加开发依赖项吗

npm i -D @babel/core @babel/preset-env @babel/register

并在根目录中添加。babelrc

{
"presets": [
  [
    "@babel/preset-env",
    {
      "targets": {
        "node": "current"
     }
    }
  ]
 ]
}

并添加到.js文件中

require("@babel/register")

或者如果你在cli中运行它,你可以使用require钩子作为-r @babel/register, ex。

$node -r @babel/register executeMyFileWithESModules.js

不幸的是,Node.js还不支持ES6的导入。

要完成您要做的事情(导入Express模块),这段代码应该足够了

var express = require("express");

另外,确保通过运行安装了Express

$ npm install express

有关学习Node.js的更多信息,请参阅Node.js文档。

My project uses node v10.21.0, which still does not support ES6 import keyword. There are multiple ways to make node recognize import, one of them is to start node with node --experimental-modules index.mjs (The mjs extension is already covered in one of the answers here). But, this way, you will not be able to use node specific keyword like require in your code. If there is need to use both nodejs's require keyword along with ES6's import, then the way out is to use the esm npm package. After adding esm package as a dependency, node needs to be started with a special configuration like: node -r esm index.js