node.js node运行es6 如何在节点中使用es6导入?




node运行es6 (9)

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

TLDR; 使用扩展名为 .mjs ES6模块保存文件并运行如下:

node --experimental-modules my-app.mjs

Node.js不支持ES6模块。 詹姆斯的这篇博客 描述了它的原因。 虽然您可以使用 Babel 来使用ES6模块语法。

这个问题在这里已有答案:

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

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

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

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

import { square, diag } from 'lib';

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

参考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));
}

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


你可以试试 esm

以下是一些介绍: esmesm


您还可以使用名为 esm npm包,它允许您在节点中使用ES6模块。 它不需要配置。 使用esm,您将能够在JS文件中使用导出/导入。

在终端上运行以下命令

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

export default myFunc;

要么

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

myFunc();

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

node  --experimental-modules  index.mjs

你也可以像这样在package.json文件中添加它

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

Hello from myFunc

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

yarn add esm 

查看 此链接 了解更多详情


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

.babelrc

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

入口点node.js app

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

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

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


回到 的原始问题

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

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


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应用程序中运行得很好。


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

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

而已。

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

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


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

官方文件说

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

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

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


使用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')

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

"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"
}

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





es6-modules