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

2021-01-08 16:54:08

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

因为一些历史原因,虽然 Node.js 已经实现了 99% 的 ES6 新特性,不过截止 2018.8.10How 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 -D1
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"))1234

用 import 替换 require

import Koa from 'koa'const app = new Koa()app.listen(8225, console.log("application is start at port 8225"))1234

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

/Users/zwkkkk1/myStudy/demo/chatroom/server/app.js:1
(function (exports, require, module, __filename, __dirname) { import Koa from 'koa'
                                                                     ^^^

SyntaxError: Unexpected identifier12345

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

1.3 新增一个 start.js 文件

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

require('babel-register') ({
    presets: [ 'env' ]})module.exports = require('./server.js')12345

注意,接下来不是 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 -g1

安装 babel-preset-env

npm install babel-preset-env -D1

然后原来是 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"))1234

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

3.2 启动文件

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

node --experimental-modules ./server.mjs1

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

比如

import example from './example'1

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

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


  • 2020-01-08 22:03:07

    修改MAC系统下默认PHP版本

    今天在使用mac时遇到了一个问题,因为需要composer拉取laravel5.6,但是提示我php版本过低,但是我本人使用的是集成环境MAMP,已经切换了php7.2的版本,这个为什么没有生效呢?经检查是因为composer检测得是mac下环境变量生效的php版本

  • 2020-01-08 23:37:08

    laravel通过图片流返回图片

    我用laravel的字母头像生成框架Laravolt\Avatar生成的base64头像,但我想做个通用但,直接返回图片,我还是根据以往但经验 改写header但返回值为图片返回值,结果返回失败,一堆乱吗,不知道为啥。 后来用了laravel自带但返回图片但方法,结果ok。记录下

  • 2020-01-08 23:45:06

    laravel response 对象一些常用功能点

    通常,我们并不只是从路由动作简单返回字符串和数组,大多数情况下,都会返回一个完整的 Illuminate\Http\Response 实例或 视图。

  • 2020-01-08 23:49:13

    laravel 存储base64格式图片

    一、总结 一句话总结: 二、laravel存储64位图片实例 三、laravel 存储前端上传base64图片 四、php将base64字符串转换为图片

  • 2020-01-09 01:24:28

    mac安装ImageMagick与PHP扩展Imagick

    mac安装ImageMagick和php7.2扩展Imagick,从网上搜索教程,感觉好少,有的教程看起来也很麻烦,不过安装起来,没想到竟然如此简单。不非纯灰之力。

  • 2020-01-09 18:49:17

    pecl安装卸载模块,如何自动配置php.ini

    利用pecl安装php模块,可能需要手工配置php.ini,以加载或禁止相关模块。那么pecl install是不是可以自动配置php.ini呢?答案是肯定的。在pecl isntall的提示信息中,苏南大叔找到了下面的类似提示信息:configuration option "php_ini" is not set to php.ini location。这个设置点,就是本文的关键所在。设置好"php_ini"之后,pecl就可以自动修改php.ini中的extension=了。

  • 2020-01-10 10:23:08

    父元素设置min-height子元素设置100%问题

    父元素设置min-height子元素高度设置100%取不到值,这是因为子元素 div设置 height:100%;只有当父级元素满足min-height:1000px;设置的条件才触发;浏览器默认是不会触发的,所以子元素的100%的高度继承就失效了。min-height 是在 height 计算之后再套用的.