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

2020/09/27 00:21 · javascript ·  · 0评论

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

更新3:节点13开始,您可以使用.mjs扩展名,也可以在package.json中设置“ type”:“ module”。并不需要使用--experimental-modules标志。

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

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

node --experimental-modules my-app.mjs

虽然import确实是ES6的一部分,但是遗憾的是,默认情况下NodeJS不支持它,并且最近才在浏览器中提供支持。

请参阅有关MDN的浏览器兼容表以及此Node问题

摘自James M Snell 关于Node.js中ES6模块更新(2017年2月):

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

在本地显示支持之前,您必须继续使用经典require语句:

const express = require("express");

如果您确实要在NodeJS中使用ES6 / 7的新功能,则可以使用Babel对其进行编译。这是一个示例服务器

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

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

var express = require("express");

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

$ npm install express

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

如其他答案中所述,Node JS当前不支持ES6导入。

(截至目前,请阅读EDIT 2)

在节点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使用command 安装npm install babel-preset-env --save,然后babel-cli使用command 安装npm install babel-cli -g --save

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

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

    "scripts": {
        "start": "babel-node src/index.js"
    }

错误: 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;

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

在您的项目中安装esm

$ npm install --save esm

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

node -r esm app.js

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

如果仍然不能使用“导入”,这就是我的处理方式:只需将其转换为对节点友好的需求即可。例:

import { parse } from 'node-html-parser';

是相同的:

const parse = require('node-html-parser').parse;

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

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

"build": "babel server --out-dir build --presets=es2015 && webpack"

随着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

当我开始使用express时,总是想要一个使用import的解决方案,而不是要求

const express = require("express");
// to 
import express from "express"

很多时间走这条线:- Unfortunately, Node.js doesn't support ES6's import yet.

现在,为了帮助其他人,我在这里创建了两个新的解决方案

1)esm:-

极其简单,无babel,无捆绑的ECMAScript模块加载器。让它工作

  yarn add esm / npm install esm

创建start.js或使用您的名称空间

 require = require("esm")(module/*, options*/)
 // Import the rest of our application.
 module.exports = require('./src/server.js')
 // where server.js is express server start file

更改您的package.josn通过路径start.js

  "scripts": {
    "start": "node start.js",
    "start:dev": "nodemon start.js",
  },
  "dependencies": {
+    "esm": "^3.2.25",
  },
  "devDependencies": {
+   "nodemon": "^1.19.2"
  }

2)Babel js:-

这可以分为2部分

a)解决方案1感谢timonweb.com

b)解决方案2

使用Babel 6babel-preset-stage-3的旧版本^ 6.0.babelrc在您的根文件夹中创建文件

{
    "presets": ["env", "stage-3"]
}

安装babel-preset-stage-3

yarn add babel-cli babel-polyfill babel-preset-env bable-preset-stage-3 nodemon --dev

更改package.json

"scripts": {
+   "start:dev": "nodemon --exec babel-node -- ./src/index.js",
+   "start": "npm run build && node ./build/index.js",
+   "build": "npm run clean && babel src -d build -s --source-maps --copy-files",
+   "clean": "rm -rf build && mkdir build"
},
"devDependencies": {
+    "babel-cli": "^6.26.0",
+    "babel-polyfill": "^6.26.0",
+    "babel-preset-env": "^1.7.0",
+    "babel-preset-stage-3": "^6.24.1",
+    "nodemon": "^1.19.4"
},

启动你的服务器

yarn start / npm start

哦,不,我们制造新的问题

regeneratorRuntime.mark(function _callee(email, password) {
^
ReferenceError: regeneratorRuntime is not defined

仅当您在代码中使用async / await时,才会出现此错误。然后使用包含自定义再生器运行时和core-js的polyfill。添加在index.js

import "babel-polyfill"

这使您可以使用异步/等待

使用Babel 7

需要更新项目中的所有内容,让我们从babel 7开始。

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

package.json中的一些更改

"scripts": {
+  "start:dev": "nodemon --exec babel-node -- ./src/index.js",
+  "start": "npm run build && node ./build/index.js",
+  "build": "npm run clean && babel src -d build -s --source-maps --copy-files",
+  "clean": "rm -rf build && mkdir build",
    ....
}
"devDependencies": {
+   "@babel/cli": "^7.0.0",
+   "@babel/core": "^7.6.4",
+   "@babel/node": "^7.0.0",
+   "@babel/polyfill": "^7.0.0",
+   "@babel/preset-env": "^7.0.0",
+   "nodemon": "^1.19.4"
....
}

import "@babel/polyfill"在起点上使用

import "@babel/polyfill"
import express from 'express'
const app = express()

//GET request
app.get('/', async (req, res) {
  // await operation
  res.send('hello world')
})
app.listen(4000, () => console.log('🚀 Server listening on port 400!'))

你在想为什么 start:dev

说真的 如果您是新手,这是一个很好的问题。每次您都对启动服务器不满意的yarn start:dev每次更改,然后自动将每个更改重新用作启动服务器用作开发服务器,以获取有关nodemon的更多信息

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

{
  "presets": ["es2015-node5", "stage-3"],
  "plugins": []
}

我要解决原始问题中没有其他人遇到的另一个问题。最近在我自己的NodeJS项目中从CommonJS转换为ESM之后,我很少看到关于无法将导入放置在所需位置的事实的讨论,就像需要require一样。我的项目现在可以很好地处理导入,但是当我使用问题中的代码时,由于没有命名函数,我首先遇到一个错误。命名功能后,我收到以下信息...

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

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

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

因此,尽管以上所有答案都可以帮助您使导入在项目中正常工作,但没有一个解决了原始问题中的代码无法按书面形式工作的事实。

我经常使用像这样的github入门项目(它使用babel)

只需安装更高版本的Node。直到不支持Node v10 es6。您需要禁用一些标志或使用

本文地址:http://javascript.askforanswer.com/node-js-syntaxerroryiwaidelingpaidaoru.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!