我不明白是怎么回事。 节点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

当前回答

我很惊讶esm竟然没有被提到。这个小但功能强大的包允许您使用import或require。

在项目中安装esm

$ NPM install——保存esm

更新您的节点启动脚本以使用esm

Node -r esm app.js

Esm就是管用。我在.mjs和——experimental-modules上浪费了大量的时间,却发现.mjs文件不能导入使用require或module.exports的文件。这是一个大问题,而esm允许你混合和匹配,它只是解决它…Esm就是管用。

其他回答

错误:SyntaxError:未预期的令牌导入或SyntaxError:未预期的令牌导出


解决方案:以更改所有导入为例

const express               = require('express');
const webpack               = require('webpack');
const path                  = require('path');
const config                = require('../webpack.config.dev');
const open                  = require('open');

同时修改export default = foo;模块。出口= foo;

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

巴别塔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。直到Node v10 es6不支持。您需要禁用一些标志或使用

作为Node.js v12(这可能是相当稳定的现在,但仍然标记为“实验”),你有两个选项使用ESM (ECMAScript模块)在Node.js(文件,有第三种方法计算字符串),以下是文档所说的:

The --experimental-modules flag can be used to enable support for ECMAScript modules (ES modules). Once enabled, Node.js will treat the following as ES modules when passed to node as the initial input, or when referenced by import statements within ES module code: Files ending in .mjs. Files ending in .js, or extensionless files, when the nearest parent package.json file contains a top-level field "type" with a value of "module". Strings passed in as an argument to --eval or --print, or piped to node via STDIN, with the flag --input-type=module. Node.js will treat as CommonJS all other forms of input, such as .js files where the nearest parent package.json file contains no top-level "type" field, or string input without the flag --input-type. This behavior is to preserve backward compatibility. However, now that Node.js supports both CommonJS and ES modules, it is best to be explicit whenever possible. Node.js will treat the following as CommonJS when passed to node as the initial input, or when referenced by import statements within ES module code: Files ending in .cjs. Files ending in .js, or extensionless files, when the nearest parent package.json file contains a top-level field "type" with a value of "commonjs". Strings passed in as an argument to --eval or --print, or piped to node via STDIN, with the flag --input-type=commonjs.