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

当前回答

如果你仍然不能使用“import”,下面是我处理它的方法: 只需将其转换为节点友好的要求。例子:

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

等于:

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

其他回答

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

使用最新的节点版本。我使用的是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”。

从版本14开始,Node的稳定版本支持import语句。x LTS。

你所需要做的就是在package.json中指定"type": "module"。

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

Node 12从Node 12开始,你可以使用.mjs扩展名,或者在package.json中设置"type": "module"。你需要带着——experimental-modules标志运行node。

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

node --experimental-modules my-app.mjs

虽然导入确实是ES6的一部分,但不幸的是,它在默认情况下还不被NodeJS支持,直到最近才在浏览器中获得支持。

查看浏览器compat表上的MDN和这个节点的问题。

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

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

在本地支持出现之前(现在在Node 13+中标记为稳定),你必须继续使用经典的require语句:

const express = require("express");

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

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

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

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

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

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

巴别塔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