Node.js-SyntaxError:意外的令牌导入

我不明白怎么了。节点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
Tony小胖2020/03/16 15:16:05

就我而言,它是在照管.babelrc文件,并且应包含以下内容:

{
  "presets": ["es2015-node5", "stage-3"],
  "plugins": []
}
JinJinDavaid卡卡西2020/03/16 15:16:05

babel 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,例如。

$node -r @babel/register executeMyFileWithESModules.js
梅JinJin十三2020/03/16 15:16:05

如果可以使用“ babel”,请尝试在package.json(-presets = es2015)中添加构建脚本,如下所示。它可以将导入代码预编译到es2015

"build": "babel server --out-dir build --presets=es2015 && webpack"
Mandy2020/03/16 15:16:05

esm没有被提及感到震惊这个小巧但功能强大的软件包允许您使用importrequire

在您的项目中安装esm

$ npm install --save esm

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

node -r esm app.js

esm正常工作。我浪费的时间TON与.mjs--experimental-modules只找出一个.mjs文件无法导入文件使用requiremodule.exports这是一个巨大的问题,但是esm允许您混合搭配,只是弄清楚了…… esm就可以了。

Eva阿飞2020/03/16 15:16:05

随着Node.js的V12的(这是现在可能还算稳定,但仍标有“实验性”),你有两个选择使用ESM(ē CMA 小号 CRIPT 中号在Node.js的odules)(的文件,有一个逃避字符串的第三种方法),这就是文档所说的内容:

--experimental-modules标志可用于启用对ECMAScript模块(ES模块)的支持。

启用后,Node.js在node作为初始输入传递给ES模块时,或import在ES模块代码内语句引用时,会将以下模块 视为ES模块:

  • 以结尾的文件.mjs

  • .js当最近的父package.json文件包含"type"值为的顶级字段时,以 结尾的文件或无扩展名的文件 "module"

  • 带有标志的字符串作为参数传递给--eval通过--print管道传递给 nodevia STDIN--input-type=module

Node.js将所有其他形式的输入视为CommonJS,例如,.js最近的父package.json文件不包含顶级"type" 字段的文件,或者不带flag的字符串输入--input-type此行为是为了保持向后兼容性。但是,既然Node.js同时支持CommonJS和ES模块,那么最好在可能的情况下使其明确。node作为初始输入传递或被importES模块代码中的语句引用时,Node.js将把以下内容视为CommonJS

  • 以结尾的文件.cjs

  • .js当最近的父package.json文件包含"type"值为的顶级字段时,以 结尾的文件或无扩展名的文件 "commonjs"

  • 带有标志的字符串作为参数传递给--eval通过--print管道传递给 nodevia STDIN--input-type=commonjs

村村凯2020/03/16 15:16:05

不幸的是,Node.js尚不支持ES6 import

要完成您要尝试执行的操作(导入Express模块​​),此代码就足够了

var express = require("express");

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

$ npm install express

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