如何在节点中使用es6导入?

时间:2017-08-24 06:11:09

标签: node.js es6-modules

我试图在节点中使用es6导入,我尝试使用此示例中提供的语法:

Cheatsheet Link:https://hackernoon.com/import-export-default-require-commandjs-javascript-nodejs-es6-vs-cheatsheet-different-tutorial-example-5a321738b50f

我正在查看支持表:http://node.green/,但无法找到支持新导入语句的版本(我尝试查找文本import / require)我目前正在查看运行节点8.1.2并且还认为,由于备忘单是指.js文件,它应该与.js文件一起使用。

当我运行代码时(摘自cheatsheet'第一个例子):

import { square, diag } from 'lib';

我收到错误: SyntaxError:意外的令牌导入。

参考lib I尝试导入:

//------ 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));
}

我缺少什么,如何让节点识别我的import语句?

11 个答案:

答案 0 :(得分:118)

  

Node.js包含了对ES6支持的实验性支持。   阅读更多相关信息:https://nodejs.org/api/esm.html

TLDR; 使用扩展名为seqValue.onNext(self.itemArray) 的ES6模块保存文件并按以下方式运行:

.mjs

Node.js不支持ES6模块。 This blog by James描述了它的原因。 虽然您可以使用Babel来使用ES6模块语法。

答案 1 :(得分:81)

浪费了大约3个小时。

我只是想在js文件中使用importexport

每个人都说不可能。但是,从2018年5月开始,可以在普通的node.js中使用上面的内容,而不需要像babel等那样的模块。

这是一种简单的方法。

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

另请注意,请注意以下Explanation

myfile.mjs

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

export default myFunc;

index.mjs

import myFunc from "./myfile"  // this is our myfile.mjs

myFunc();

运行

node  --experimental-modules  index.mjs

输出

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

Hello from myFunc

说明:

  1. 由于它是实验模块,.js文件名为.mjs文件
  2. 在运行时,您会将--experimental-modules添加到node index.mjs
  3. 在输出中使用实验模块运行时,您将看到:“(node:12020)ExperimentalWarning:ESM模块加载器是实验性的。 “
  4. 我有当前版本的节点js,所以如果我运行node --version,它会给我“v10.3.0”,虽然LTE /稳定/推荐版本是8.11.2 LTS。
  5. 将来的某一天,你可以使用.js而不是.mjs,因为你变得稳定而不是实验。
  6. 有关实验性功能的更多信息,请参阅:https://nodejs.org/api/esm.html
  7. 希望有所帮助。

答案 2 :(得分:59)

您还可以使用名为 esm 的npm软件包,该软件包允许您在节点中使用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

检查this link以获得更多详细信息

答案 3 :(得分:17)

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

  1. 使用支持 - experimental-modules 标志
  2. 的节点版本
  3. 您的 .js 文件必须重命名为 .mjs < / LI>

    那就是它。

    然而,这是一个很大的问题,而你的闪亮的纯ES6代码将在NodeJS等环境中运行(编写9.5.0),你仍然会有疯狂的发现只是为了测试。另外请记住,Ecma已经声明Javascript的发布周期会更快,更新的功能会定期提供。虽然对于像NodeJS这样的单一环境来说这不会有任何问题,但它对于浏览器环境来说却略有不同。显而易见的是,测试框架在追赶方面有很多工作要做。您仍然需要转换测试框架。我建议使用jest。

    还要注意捆绑框架,你会遇到问题

答案 4 :(得分:13)

您可以尝试esm

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

答案 5 :(得分:7)

<强>溶液

https://www.npmjs.com/package/babel-register

// this is to allow ES6 export syntax
// to be properly read and processed by node.js application
require('babel-register')({
  presets: [
    'env',
  ],
});

// after that any line you add below that has typical es6 export syntax 
// will work just fine

const utils = require('../../utils.js');
const availableMixins = require('../../../src/lib/mixins/index.js');

下面是mixins / index.js

的定义
export { default as FormValidationMixin } from './form-validation'; // eslint-disable-line import/prefer-default-export

在我的node.js CLI app中运行得很好。

答案 6 :(得分:6)

返回Jonathan002关于

的原始问题
  

“......哪个版本支持新的ES6导入语句?”

基于article by Dr. Axel Rauschmayer,有一个计划默认支持它(没有实验命令行标志)在Node.js 10.x LTS 。根据{{​​3}},因为它是在2018年3月29日,它可能会在2018年4月之后变为,而它的LTS将于2018年10月开始。

答案 7 :(得分:4)

  "devDependencies": {
    "@babel/core": "^7.2.0",
    "@babel/preset-env": "^7.2.0",
    "@babel/register": "^7.0.0"
  }

.babelrc

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

入口点node.js应用

require("@babel/register")({})

// Import the rest of our application.
module.exports = require('./index.js')

链接如何在Node.JS https://timonweb.com/posts/how-to-enable-es6-imports-in-nodejs/中启用ES6导入

答案 8 :(得分:3)

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

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

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

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

答案 9 :(得分:2)

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

official docs state

  如果最接近的父package.json包含“ type”:“ module”,则

.js和无扩展名文件的导入语句将被视为ES模块。

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

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

答案 10 :(得分:0)

使用Node v12.2.0,我可以像这样导入所有标准模块:

import * as Http from 'http'
import * as Fs from 'fs'
import * as Path from 'path'
import * as Readline from 'readline'
import * as Os from 'os'

相对于我之前所做的事情:

const
  Http = require('http')
  ,Fs = require('fs')
  ,Path = require('path')
  ,Readline = require('readline')
  ,Os = require('os')

任何ECMAScript模块都可以导入,而无需使用.mjs扩展名,只要它的package.json文件中包含以下字段即可:

"type": "module"

因此,请确保将package.json文件放在与要创建的模块相同的文件夹中。

要导入未使用ECMAScript模块支持更新的模块,您可以这样做:

// Implement the old require function
import { createRequire } from 'module'
const require = createRequire(import.meta.url)

// Now you can require whatever
const
  WebSocket = require('ws')
  ,Mime = require('mime-types')
  ,Chokidar = require('chokidar')

当然,不要忘记使用模块导入来实际运行脚本是必需的:

node --experimental-modules my-script-that-use-import.js

并且该文件夹的父文件夹需要该package.json文件,才能不抱怨导入语法:

{
  "type": "module"
}

如果您要使用的模块尚未更新以支持使用import语法导入,那么除了使用require之外,您别无选择(但是上面的解决方案没有问题)。