通過(guò) babel-node 運(yùn)行 ES6 import/export 語(yǔ)法

由于自己經(jīng)常在本地寫一些 js 腳本進(jìn)行文件處理等工作,常常會(huì)使用 import 語(yǔ)法引入模塊。但是 Node 在默認(rèn)情況下是不支持 import 和 export 的。

例如下面的文件

import fs from 'fs';
// do sth...

運(yùn)行腳本后,會(huì)發(fā)現(xiàn) import 語(yǔ)法報(bào)錯(cuò)

$ node test.js

(function (exports, require, module, __filename, __dirname) { import fs from 'fs';
                                                                     ^^

SyntaxError: Unexpected identifier
    at new Script (vm.js:79:7)
    at createScript (vm.js:251:10)
    ...

這里我提供一個(gè)自己在本地調(diào)試 js 代碼時(shí)常使用的方式:使用 babel-node 命令,來(lái)運(yùn)行含有 import/export 語(yǔ)法的 js 代碼。

注意:babel-node 不能用于生產(chǎn)環(huán)境!因?yàn)?babel-node 會(huì)加載更多資源和模塊,使得運(yùn)行環(huán)境變「重」。

1. 安裝 babel-node

babel-node 命令并非獨(dú)立安裝,在該死的 Babel 7.x 以前,需要通過(guò)安裝 babel-cli 包獲得。而在更該死的 Babel 7.x 以后,babel 的模塊被被拆分。因此需要安裝 @babel/core @babel/node 兩個(gè)包來(lái)獲取。

如果你希望 babel-node 命令在全局可用,使用 -g 參數(shù)會(huì)讓你一勞永逸。

babel 7.x 以前的寫法
$ npm i -g babel-cli
babel 7.x 以后的寫法
$ npm i -g @babel/core @babel/node

2. 安裝 presets 并配置 .babelrc 文件

僅單安裝 babel-node 也沒(méi)用,運(yùn)行 js 文件后你會(huì)發(fā)現(xiàn)依然報(bào)錯(cuò)。這是因?yàn)?babel-node 對(duì) import 語(yǔ)法默認(rèn)也是關(guān)閉的,因此需要安裝指定的 preset 并配置 .babelrc 文件來(lái)開啟語(yǔ)法支持。

截止2019年1月,原有的 babel-preset-es2015 寫法已經(jīng)廢棄,與之代替的是 babel-preset-env 或者 @babel/preset-env,目前以后者為推薦。(鬼知道 babel 還會(huì)不會(huì)再變...)

由于兩個(gè) preset 模塊對(duì)應(yīng)的屬性不同,因此分介紹:

第一種 babel-preset-env 寫法
$ npm i babel-preset-env --save-dev

.babelrc 文件配置

{
  "preset": [ "env" ]
}
第二種 @babel/preset-env 寫法
$ npm i @babel/preset-env --save-dev

.babelrc 文件配置

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

3. 執(zhí)行 babel-node

至此經(jīng)過(guò)上述配置,再通過(guò) babel-node 即可執(zhí)行含有 import/export 等 es6 語(yǔ)法的 js 文件。

$ babel-node test.js

最后切記由于性能問(wèn)題,babel-node 僅限于在本地調(diào)試時(shí)使用,上線生產(chǎn)環(huán)境的代碼還是需要使用 babel 進(jìn)行轉(zhuǎn)換,再使用 node 運(yùn)行。

參考資料

babel-node
babel-preset-es2015 -> babel-preset-env
@babel/preset-env

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • babel官網(wǎng) babel 介紹 Babel 是一個(gè)通用的多用途 JavaScript 編譯器。通過(guò) Babel ...
    鋒享前端閱讀 1,931評(píng)論 0 10
  • babel 7 的使用的個(gè)人理解 最近看了很多關(guān)于babel的使用方法,大部分在一些點(diǎn)上都沒(méi)有說(shuō)明白,同時(shí)給出的代...
    zshawk1982閱讀 21,190評(píng)論 14 43
  • babel官網(wǎng) babel 介紹 Babel 是一個(gè)通用的多用途 JavaScript 編譯器。通過(guò) Babel ...
    不得不愛(ài)XIN閱讀 1,231評(píng)論 0 9
  • 在 Github 上 Fork 了別人的代碼,在 package.json 中看到了很多與 Babel 有關(guān)的包,...
    dkvirus閱讀 1,102評(píng)論 0 3
  • 阮一峰的博客 http://es6.ruanyifeng.com/ 一 ES6簡(jiǎn)介 ECMAScript 6.0(...
    ai搞搞閱讀 1,840評(píng)論 0 0

友情鏈接更多精彩內(nèi)容