如何在 Node.js 中使用 import / export 的三种方法

2019-08-07 17:16:53

如何在 Node.js 中使用 import / export 的三种方法

因为一些历史原因,虽然 Node.js 已经实现了 99% 的 ES6 新特性,不过截止 2018.8.10,How To Enable ES6 Imports in Node.JS 仍然是老大难问题


下面我来介绍三种方法可以让我们在 Node.js 中使用 import/export 。


注:第1、2种方法均是借助 babel,需要注意的是文章使用的babel版本 < 7。从 babel 7.X 版本开始,部分包名、用法发生了些许变化,大体与7之前的用法类似,详细请到官方手册学习 7.X 版本的改动(Babel 踩坑总结(三) —— 7.X 版本升级是我对 7.X 版本三大改动的总结)


1. 使用 babel-register

1.1 下载必须的包

npm install babel-register babel-preset-env -D

1

1.2 修改你的 server.js

下面是一个 server.js 的例子:


const Koa = require('koa')

const app = new Koa()


app.listen(8225, console.log("application is start at port 8225"))

1

2

3

4

用 import 替换 require


import Koa from 'koa'

const app = new Koa()


app.listen(8225, console.log("application is start at port 8225"))

1

2

3

4

如果你现在用 node server.js 跑这个文件,你会收到像这样的错误提示:


/Users/zwkkkk1/myStudy/demo/chatroom/server/app.js:1

(function (exports, require, module, __filename, __dirname) { import Koa from 'koa'

                                                                     ^^^


SyntaxError: Unexpected identifier

1

2

3

4

5

下面让我们用 babel 来解决这个问题


1.3 新增一个 start.js 文件

这个文件将成为我们的入口文件,里面是一些 babel 的代码


require('babel-register') ({

    presets: [ 'env' ]

})


module.exports = require('./server.js')

1

2

3

4

5

注意,接下来不是 node server.js,而是用 node start.js 来启动这个文件


2. 使用 babel-node 命令

如果你不想添加新的文件也可以,这里需要在命令行中使用 babel-node 命令。babel-node 命令不是独立安装,在 Babel 7.X 版本前,需要通过安装 babel-cli 包获得;在 Babel 7.X 版本,需要安装 @babel/core、@babel/cli 两个包。


此处以 7.X 之前的版本举例,7.X 版本可去官网查找对应包的使用用例


安装必要的插件


全局安装 babel-cli


npm install babel-cli -g

1

安装 babel-preset-env


npm install babel-preset-env -D

1

然后原来是 node server.js,改为这样调用:babel-node --presets env server.js


需要注意的是如果只是为了 babel-node 这一个命令,安装 babel-cli 会加载安装很多资源和模块,出于性能考虑不推荐在生产环境使用。自己在开发调试的时候,可以鼓捣着玩玩


3. 来自 Node.js 官方的力量

Node 9提供了一个尚处于 Experimental 阶段的模块,让我们可以抛弃 babel 等一类工具的束缚,直接在 Node 环境下使用 import/export。


官方手册:ECMAScript Modules

一个不错的教程:Node 9下import/export的丝般顺滑使用

有兴趣的可以去了解一下,嫌字多的可以继续往下看看我总结的使用方法


用前须知

Node 版本需在 9.0 及以上

不加 loader 时候,使用 import/export 的文件后缀名必须为 .mjs

举个例子,还是用上面的例子,请将代码回退到 Babel 中第一步的样子


3.1 改写 server.js

import Koa from 'koa'

const app = new Koa()


app.listen(8225, console.log("application is start at port 8225"))

1

2

3

4

和前面一样,不过将文件名改一下,从 server.js 改为 server.mjs


3.2 启动文件

执行下面代码,来启动文件


node --experimental-modules ./server.mjs

1

注意这是引用 koa 第三方模块不用做其他变化,如果要 import 自己的文件,那么那个待引入的文件也要改后缀。


比如


import example from './example'

1

那么原来应该是 example.js 要改为 example.mjs


目前这个模块还处于实验阶段,还是不要放到生产环境,自己拿出来玩玩还是可以的,


  • 2019-12-20 13:24:58

    瓦片地图生成使用以及原理

    我们都知道地球是圆的,电脑显示器是平的,要想让位于球面的形状显示在平面的显示器上就必然需要一个转换过程,这个过程就叫做投影(Projection)。在地球上我们通过经纬度来描述某个位置,而经过投影之后的地图也有自己的坐标系统,本篇文章就来详细介绍在百度地图API中涉及的各种坐标体系。

  • 2019-12-20 13:27:16

    腾讯地图谷歌和高德地图等自定义地图区别

    腾讯、百度、Google的地图投影均采用Web Mercator 投影坐标系;腾讯与Google的地图瓦片分辨率及切片范围是完全相同的,仅仅是命名规则稍有不同,这就使得同一位置和缩放级别的地图瓦片是完全可以重叠的;而百度地图每个缩放级别分辨率与前两者均不相同,而且地图瓦片的坐标原点做了一定的偏移,导致百度地图与前两者的瓦片是无法重叠的,这是因为百度在GCJ-02的基础上又进行了加密处理,形成了百度独有的BD-09坐标系。

  • 2019-12-22 08:06:48

    如何快速撤销上一次的commit

    在平时工作中使用git难免会提交一些错误的文件到git库里,这时候,撤销吧,怕把正确的文件删除了,不撤销重新改又很麻烦,下面,我就从提交的三个阶段,来讲解如何撤销错误的操作。

  • 2019-12-23 14:54:03

    RPC, REST ,GraphQL区别比较优劣

    其实在使用和学习的过程中,有很多文章都对比过它们的异同,但是大部分文章并没有从一个相对客观的角度来对比,更多是为了突显一个的优点而刻意指出另外一个的缺点。这让我想到一句话,脱离业务情景谈技术就是耍流氓。