如何在节点中使用es6导入?[重复]

我试图使ES6节点中导入挂起,并尝试使用此示例中提供的语法:

备忘单链接

我正在浏览支持表,但无法找到哪个版本支持新的导入语句(我尝试查找文本导入/请求),我目前正在运行节点8.1.2,并且也相信,由于备忘单是引用.js文件,它应该与.js文件一起使用。

当我运行代码时(摘自备忘单的第一个示例):

import { square, diag } from 'lib';

我得到错误:

SyntaxError: Unexpected token import.

我要导入的对lib的引用:

//------ lib.js ------
export const sqrt = Math.sqrt;
export function square(x) {
    return x * x;
}
export function diag(x, y) {
    return sqrt(square(x) + square(y));
}

我想念的是什么?如何node才能认出我的import陈述?

梅Jim2020/03/19 11:19:59

使用.mjs扩展名(如接受的答案中建议的那样)以启用ECMAScript模块,但是,对于Node.js v12,您还可以在中全局启用此功能package.json

官方的文档说明

如果最近的父package.json包含“ type”:“ module”,则.js和无扩展名文件的import语句将被视为ES模块。

{
  "type": "module",
  "main": "./src/index.js"
}

(当然--experimental-modules,启动应用程序时,您仍然必须提供标志)。

泡芙番长2020/03/19 11:19:59

我不知道这是否适用于您的情况,但是我正在使用此运行快递服务器:

nodemon --inspect ./index.js --exec babel-node --presets es2015,stage-2

即使我仅使用节点版本8,这也使我能够导入和使用扩展运算符。

您需要安装babel-cli,babel-preset-es2015,babel-preset-stage-2来完成我的工作。

泡芙神无伽罗2020/03/19 11:19:59

回到Jonathan002的原始问题

“ ...什么版本支持新的ES6导入语句?”

根据Axel Rauschmayer博士文章,有一个计划是在Node.js 10.x LTS中默认支持它(没有实验性命令行标志)根据node.js的发布计划(2018年3月29日发布),它很可能在2018年4月之后可用,而LTS 的发布计划将在2018年10月开始。

泡芙梅2020/03/19 11:19:59

你可以试试看esm

以下是一些介绍:https : //www.npmjs.com/package/esm

Davaid小胖2020/03/19 11:19:59

如果在服务器端使用模块系统,则完全不需要使用Babel。要在NodeJS中使用模块,请确保:

  1. 使用支持--experimental-modules标志的节点版本
  2. 然后,您的.js文件必须重命名为.mjs

而已。

但是,这确实是一个很大的问题,尽管您灵敏的纯ES6代码将在NodeJS之类的环境中运行(在编写9.5.0时),但您仍然会疯狂地进行测试。还请记住,Ecma表示Javascript的发布周期将会更快,并且会定期提供更新的功能。尽管对于像NodeJS这样的单一环境来说这没有问题,但对于浏览器环境而言,它的主张却稍有不同。显而易见的是,测试框架在追赶上有很多工作要做。您可能仍需要为测试框架进行转换。我建议使用开玩笑。

另外请注意捆绑框架,您将在其中遇到问题

逆天GO2020/03/19 11:19:59

浪费了大约3个小时。

我只是想在importexportjs文件中使用。

所有人都说不可能。但是,从2018年5月开始,可以在普通的node.js中使用上面的代码,而无需像babel这样的任何模块。

这是一种简单的方法。

创建以下文件,运行并亲自查看输出。

也别忘了看Explanation下面。

myfile.mjs

function myFunc() {
    console.log("Hello from myFunc")
}

export default myFunc;

index.mjs

import myFunc from "./myfile.mjs"  // simply using "./myfile" may not work in all resolvers

myFunc();

node  --experimental-modules  index.mjs

输出

(node:12020) ExperimentalWarning: The ESM module loader is experimental.

Hello from myFunc

说明:

  1. 由于是实验模块,因此.js文件被命名为.mjs文件
  2. 在运行时,您将添加--experimental-modulesnode index.mjs
  3. 在输出中运行实验模块时,您将看到:“(node:12020)ExperimentWarning:ESM模块加载器是实验性的。”
  4. 我具有最新版本的node js,因此,如果node --versionLTE / stable / recommended版本为8.11.2 LTS,则如果运行它,它会显示“ v10.3.0”。
  5. 将来某天,您可以使用.js代替.mjs,因为这些功能变得稳定而不是试验性。
  6. 有关实验性功能的更多信息,请参见:https : //nodejs.org/api/esm.html

希望能有所帮助。

 

神乐神无2020/03/19 11:19:58

Node.js包括对ES6支持的实验性支持。在此处了解更多信息:https : //nodejs.org/docs/latest-v13.x/api/esm.html#esm_enabling

TLDR;

节点> = v13

在Node 13及更高版本中,这非常简单。您需要:

  • 保存带有.mjs扩展名的文件,或
  • 加入{ "type": "module" }最接近的package.json

您只需执行上述操作之一即可使用ES模块。

节点<= v12

如果您使用的是节点版本8-12,请使用.mjs扩展名为ES6的模块保存文件并按以下方式运行:

node --experimental-modules my-app.mjs
理查德前端2020/03/19 11:19:58

您还可以使用名为esm的 npm软件包,该软件包允许您在node中使用ES6模块。不需要配置。使用esm,您将可以在JS文件中使用导出/导入。

在终端上运行以下命令

yarn add esm 

要么

npm install esm

之后,使用节点启动服务器时需要此软件包。例如,如果您的节点服务器运行index.js文件,则可以使用以下命令

node -r esm index.js

您也可以像这样将其添加到package.json文件中

{
  "name": "My-app",
  "version": "1.0.0",
  "description": "Some Hack",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node -r esm index.js"
  },

}

然后从终端运行此命令以启动节点服务器

npm start

检查此链接以获取更多详细信息