亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

如何讓node運行es6模塊文件及其原理詳解

2024-05-06 16:47:05
字體:
來源:轉載
供稿:網友

最新版的 node 支持最新版 ECMAScript 幾乎所有特性,但有一個特性卻一直到現在都還沒有支持,那就是從 ES2015 開始定義的模塊化機制。而現在我們很多項目都是用 es6 的模塊化規范來寫代碼的,包括 node 項目,所以,node 不能運行 es6 模塊文件就會很不便。

讓 node 運行 es6 模塊文件的方式有兩種:

  • 轉碼 es6 模塊為 commonjs 模塊
  • hook node 的 require 機制,直接讓 node 的 require 加載 import/export

1. 轉碼 es6 模塊為 commonjs 模塊

因為 node 支持幾乎所有除 import/export 外的語法,所以我們只需要將 import/export 轉碼成 require/exports,而不需要轉碼其他語法。

比如下面的項目:

- package.json- src/ - index.js - print.js - ...
# package.json{ "main": "lib/index.js"    # 由工具轉碼 src 目錄下源文件到 lib 目錄下}# src/index.jsimport print from './print';print('index');export default print;# src/print.jsexport default str => { console.log('print: ' + str);};

因為 src 目錄下的源文件都是 es6 模塊化規范的,node 并不能直接運行,所以需要轉碼成 commonjs 規范的代碼。

這個過程有兩個方案:

  • 如果不會單獨使用 src 目錄下的某個文件,而僅僅是以 src/index.js 為入口文件使用,可以把 src 目錄下的文件打包成一個文件到 lib/index.js:這種方式推薦使用工具 rollup
  • 如果需要單獨使用 src 目錄下的文件,那就需要把 src 目錄下的文件一對一的轉碼到 lib 目錄下:這種方式推薦使用工具 gulp babel

1.1 用 rollup 把 src 目錄下的文件打包成一個文件到 lib/index.js

相關文件:

# rollup.config.jsexport default { input: 'src/index.js', output: { file: 'lib/index.js', format: 'cjs', },};# package.json{ "scripts": { "build": "rollup -c" }, "devDependencies": { "rollup": "^0.66.4" }}

運行命令:

npm run build

結果:

# lib/index.js'use strict';var print = str => { console.log('print: ' + str);};print('index');module.exports = print;

1.2 用 gulp babel 把 src 目錄下的文件一對一的轉碼到 lib 目錄下

相關文件:

# build.jsconst gulp = require('gulp');const babel = require('gulp-babel');gulp.task('babel', () => gulp.src('src/**/*.js') .pipe(babel({  plugins: ['@babel/plugin-transform-modules-commonjs'] })) .pipe(gulp.dest('lib')));gulp.series('babel')();# package.json{ "scripts": { "build": "node build.js" }, "devDependencies": { "@babel/core": "^7.1.2", "@babel/plugin-transform-modules-commonjs": "^7.2.0", "gulp": "^4.0.0", "gulp-babel": "^8.0.0" }}

運行命令:

npm run build

結果:

# lib/index.js"use strict";Object.defineProperty(exports, "__esModule", { value: true});exports.default = void 0;var _print = _interopRequireDefault(require("./print"));function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }(0, _print.default)('index');var _default = _print.default;exports.default = _default;# lib/print.js"use strict";Object.defineProperty(exports, "__esModule", { value: true});exports.default = void 0;var _default = str => { console.log('print: ' + str);};exports.default = _default;

2. hook node 的 require 機制,直接加載 import/export

這種機制一般是通過對 node 的 require 機制進行 hook,劫持 require 抓取的源文件代碼,把源代碼轉碼成 commonjs 規范之后,再傳送給 require 機制原本的代碼流中。

pirates 之類的第三方 npm 包提供了這種添加 hook 的功能。

babel-register 便是使用這種方式達到 node 運行 es6 模塊文件的目的的。

2.1 使用 babel-register 直接運行 es6 模塊文件

示例目錄:

- package.json- src/ - entry.js       # 這里多了一個入口文件,專門用于注冊 babel-register - index.js - print.js - ...

相關文件:

# package.json{ "scripts": { "run": "node src/entry.js" }, "devDependencies": { "@babel/core": "^7.1.2", "@babel/plugin-transform-modules-commonjs": "^7.2.0", "@babel/register": "^7.0.0" }}# src/entry.js       # 入口文件必須使用 commonjs 規范來寫,因為還沒有注冊 hookrequire('@babel/register')({ plugins: ['@babel/plugin-transform-modules-commonjs']});require('./index');# src/index.jsimport print from './print';print('index');# src/print.jsexport default str => { console.log('print: ' + str);};

運行:

npm run run

結果:

# 命令行打印print: index

這種方式因為中間轉碼會有額外的性能損耗,所以不建議在生產環境下使用,只建議在開發模式下使用。

2.2 使用babel-node 直接運行 es6 模塊文件

babel-node 對 babel-register 進行了封裝,提供了在命令行直接運行 es6 模塊文件的便捷方式。

示例目錄:

- package.json- src/ - index.js - print.js - ...

相關文件:

# package.json{ "scripts": { "run": "babel-node src/index.js --plugins @babel/plugin-transform-modules-commonjs" }, "devDependencies": { "@babel/core": "^7.1.2", "@babel/node": "^7.2.0", "@babel/plugin-transform-modules-commonjs": "^7.2.0" }}# src/index.jsimport print from './print';print('index');# src/print.jsexport default str => { console.log('print: ' + str);};

運行:

npm run run

結果:

# 命令行打印print: index

這種方式也不建議在生產環境下使用,只建議在開發模式下使用。

3. 鏈接

es6 就是指 ECMAScript 2015

es7 就是指 ECMAScript 2016

es8 就是指 ECMAScript 2017

es9 就是指 ECMAScript 2018

到寫這篇文章為止,已發布了 ECMAScript 2018。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频日韩精品| 社区色欧美激情 | 亚洲人成绝费网站色www| 中文字幕欧美日韩| 日本一本a高清免费不卡| 在线看福利67194| 欧美激情免费观看| 欧美日韩精品在线| 日韩精品极品在线观看播放免费视频| 久久精品国亚洲| 久久久久99精品久久久久| 日韩国产在线播放| 日av在线播放中文不卡| 国产精品入口日韩视频大尺度| 成人黄色在线观看| 国产一区二区黄| 国产精品ⅴa在线观看h| 97精品视频在线| 热久久视久久精品18亚洲精品| 国产精品久久久久久久久久三级| 国产精品三级久久久久久电影| 69av在线视频| 亚洲大胆人体视频| 深夜成人在线观看| 欧美性jizz18性欧美| 人人澡人人澡人人看欧美| 久久在线精品视频| 亚洲在线免费看| 亚洲字幕一区二区| 国产精品一区二区三区在线播放| 欧美精品一区在线播放| 亚洲欧美日韩中文在线制服| 精品国内自产拍在线观看| 国产精品嫩草视频| 亚洲人永久免费| 国产一区二区丝袜高跟鞋图片| 亚洲精品资源在线| 欧美人与性动交a欧美精品| 亚洲午夜av久久乱码| 亚洲一区二区三区香蕉| 久久精品中文字幕电影| 正在播放欧美视频| 日本韩国欧美精品大片卡二| 欧美亚洲国产精品| 日韩一区视频在线| 亚洲精品美女视频| 久久久久北条麻妃免费看| 久久久久久久999精品视频| 在线成人中文字幕| 欧美高清视频一区二区| 欧美视频免费在线观看| 在线日韩欧美视频| 国产精品久久久久高潮| 亚洲人成在线电影| 91wwwcom在线观看| 欧美电影电视剧在线观看| 色与欲影视天天看综合网| 亚洲已满18点击进入在线看片| 欧美激情手机在线视频| 国产成人激情小视频| 欧美主播福利视频| 日本欧美爱爱爱| 国产精品久久久久久婷婷天堂| 国产精品美女久久久久av超清| 伦伦影院午夜日韩欧美限制| 热99精品只有里视频精品| 欧美精品第一页在线播放| 91在线免费网站| 91免费精品国偷自产在线| 欧美激情一区二区三级高清视频| 欧美视频裸体精品| 亚洲日韩中文字幕| 国产精品爽爽爽| 91在线视频成人| 亚洲男人第一网站| 欧美xxxx14xxxxx性爽| 亚洲精品一区中文字幕乱码| 国产精品嫩草影院一区二区| xvideos亚洲人网站| 中文字幕国产精品久久| 欧美俄罗斯性视频| 久久国产精品久久国产精品| 久久久999成人| 亚洲成人xxx| 日韩精品中文字幕在线播放| 亚洲图片欧美日产| 日韩欧美国产高清91| 91美女片黄在线观看游戏| 欧美中文在线字幕| 亚洲精品97久久| 国产精品久久久久久影视| 久久手机精品视频| 国产精品国产福利国产秒拍| 在线看日韩av| 欧美精品生活片| 国产不卡精品视男人的天堂| 日韩欧美国产激情| 国产成人a亚洲精品| 成人在线一区二区| 亚洲精品欧美日韩专区| 国产欧美精品一区二区三区介绍| 国产精品99一区| 亚洲男人av在线| 日韩精品视频观看| 麻豆精品精华液| 国产成人精品电影久久久| 日韩av电影在线播放| 91免费精品国偷自产在线| 国产精品久久久久国产a级| 国语自产精品视频在线看抢先版图片| 国内久久久精品| 亚洲男人的天堂在线播放| 欧美日韩免费区域视频在线观看| 91亚洲精品在线| 亚洲精品黄网在线观看| 欧美日韩综合视频网址| 日韩电影免费观看中文字幕| 日本欧美爱爱爱| 欧美精品激情在线观看| 精品激情国产视频| 亚洲另类激情图| 亚洲一区二区久久久久久久| 国产亚洲美女久久| 91精品国产一区| 日韩欧美国产免费播放| 日韩欧美成人网| 亚洲人成啪啪网站| 精品美女久久久久久免费| 成人黄色av播放免费| 国产欧美精品xxxx另类| 国产精品久久二区| 久久精品夜夜夜夜夜久久| 日本国产一区二区三区| 亚洲最大福利网站| 久久久久久久久久久久av| 久久综合免费视频影院| 成人黄色大片在线免费观看| 日韩精品免费在线视频观看| 欧美日韩国产999| 欧美一级bbbbb性bbbb喷潮片| 在线精品国产欧美| 日韩精品中文在线观看| 欧美老女人性生活| 国产性猛交xxxx免费看久久| 亚洲视频一区二区| 琪琪第一精品导航| 欧美激情国产高清| 久久精品夜夜夜夜夜久久| 久久精品久久久久| 久久久久久网站| 欧美国产日韩一区二区三区| 亚洲国产精品va在线看黑人| 性色av一区二区咪爱| 成人免费xxxxx在线观看| 亚洲欧美日韩另类| 97香蕉超级碰碰久久免费软件| 91地址最新发布| 羞羞色国产精品| 97久久久久久| 国产欧美欧洲在线观看| 国产精品激情av电影在线观看| 91亚洲国产成人久久精品网站| 欧美日韩国产黄| 91国产高清在线|