Node.js - 语法错误:意外的令牌导入

IT技术 javascript node.js npm ecmascript-6
2021-02-04 07:29:31

我不明白出了什么问题。节点 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
6个回答

Node 13+Node 13 开始,您可以使用.mjs扩展名,也可以{"type": "module"}在 package.json 中进行设置并不需要使用--experimental-modules标志。module现在在 node.js 中被标记为稳定

Node 12Node 12 开始,您可以使用.mjs扩展名,也可以"type": "module"在 package.json 中进行设置并且您需要使用--experimental-modules标志运行节点

节点 9节点 9 中,它在标志后面启用,并使用.mjs扩展。

node --experimental-modules my-app.mjs

虽然import它确实是 ES6 的一部分,但遗憾的是,NodeJS 默认尚不支持它,并且直到最近才在浏览器中获得支持。

请参阅MDN 上的浏览​​器兼容性表此节点问题

来自 James M Snell对 Node.js 中 ES6 module更新(2017 年 2 月):

工作正在进行中,但需要一些时间——我们目前至少需要一年左右的时间。

在原生支持出现之前(现在在 Node 13+ 中标记为 stable),您必须继续使用经典require语句

const express = require("express");

如果你真的想在 NodeJS 中使用新的 ES6/7 特性,你可以使用 Babel 编译它。这是一个示例服务器

题外话,但我无法安装节点 14,因为它不再支持 Windows 7。很遗憾,如果我想要完全支持没有任何标志的导入/导出,那么我必须升级我的操作系统。
2021-03-16 07:29:31
2021-03-19 07:29:31
@Scimonster......node --experimental-modules my-app.mjs (node:12176) ExperimentalWarning:ESM module加载器是实验性的。{ 错误:在搜索时找不到module /C:/Users/WittyParrot/Documents/card-test-project/src/my-app.mjs (internal/modules/esm/DefaultResolve.js:23:12)test-project/ src/my-app.mjs at search (internal/modules/esm/DefaultResolve.js:23:12)....抛出警告找不到 my-app.js....请建议....i已安装节点版本 9.11.1
2021-04-05 07:29:31
有谁知道 node 10 是否会默认启用支持?(下个月出道)
2021-04-06 07:29:31
似乎 Node v13.2.0 无法将 ES module作为“.js”导入或导入(),除非在其上方某处有 type: module 的 package.json。esm 在这些情况下仍然有用。
2021-04-08 07:29:31

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

为了完成你想要做的事情(导入 Express module),这段代码就足够了

var express = require("express");

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

$ npm install express

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

Node 现在本身就支持这个,所以这个答案已经过时了
2021-03-22 07:29:31
import不一定是 TypeScript 的特性。TypeScript 是带有类型的 ES6。所以像 import 这样的东西是 ES6 原生的。
2021-03-30 07:29:31

我很震惊esm没有被提及。这个小而强大的包允许您使用importrequire

在你的项目中安装 esm

$ npm install --save esm

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

node -r esm app.js

esm只是工作。我浪费的时间TON与.mjs--experimental-modules只找出一个.mjs文件无法导入文件使用requiremodule.exports这是一个巨大的问题,而esm允许您混合和匹配,它只是想通了......esm只是有效。

如何使用 esm 通过 Visual Studio Code 调试器进行调试?我想直接在VSCode中按F5开始调试js。
2021-03-10 07:29:31
如果您使用 nodemon,请更新您的 npm 脚本以nodemon -r esm app.js使用此解决方案自动重新加载。
2021-03-18 07:29:31
哇。我不相信这是真的,但确实如此。
2021-03-27 07:29:31

正如其他答案中提到的,Node JS 目前不支持 ES6 导入。

(截至目前,阅读编辑 2)

在 node js 中启用 ES6 导入提供了解决此问题的方法。我试过这个,它对我有用。

运行命令:

    npm install babel-register babel-preset-env --save-dev

现在您需要创建一个新文件 (config.js) 并向其中添加以下代码。

    require('babel-register')({
        presets: [ 'env' ]
    })
    // Import the rest of our application.
    module.exports = require('./your_server_file.js')

现在您可以编写导入语句而不会出现任何错误。

希望这可以帮助。

编辑:

您需要运行使用上述代码创建的新文件。就我而言,它是config.js. 所以我必须运行:

    node config.js

编辑2:

在试验过程中,我找到了一个简单的解决方案来解决这个问题。

.babelrc在项目的根目录中创建文件。

添加以下内容(以及您需要的任何其他 babel 预设,可以添加到此文件中):

    {
        "presets": ["env"]
    }

babel-preset-env使用命令安装npm install babel-preset-env --save,然后babel-cli使用命令安装npm install babel-cli -g --save

现在,转到您的服务器或索引文件所在的文件夹并使用以下命令运行: babel-node fileName.js

或者您可以npm start通过在package.json文件中添加以下代码来运行 using

    "scripts": {
        "start": "babel-node src/index.js"
    }
@tpbafk 我没有研究过电子。但我发现了一些类似于你的问题javascript - How to set npm start for electron app with 'babel-node --presets es2015,stage-3'希望能帮助到你
2021-03-14 07:29:31
我如何用电子做到这一点?我试过这样:"start": "babel-node electron .", 但没有运气
2021-03-30 07:29:31

错误: 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;module.exports = foo;

我希望你能多解释一下导出默认部分。我在那个部分有问题。导入非常适合您的答案。
2021-03-11 07:29:31
在我的答案之前有一个答案,其中有一个解释。但是为了澄清 Node 不支持 ES6 语法。当您说 Import ... 时,您使用的是 ES6 语法
2021-04-09 07:29:31