<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

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

        來源:懂視網 責編:小采 時間:2020-11-27 22:02:38
        文檔

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

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

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

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

      1. 轉碼 es6 模塊為 commonjs 模塊
      2. hook noderequire 機制,直接讓 noderequire 加載 import/export
      3. 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.js
        import print from './print';
        
        print('index');
        
        export default print;
        
        
        # src/print.js
        export default str => {
         console.log('print: ' + str);
        };

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

        這個過程有兩個方案:

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

        相關文件:

        # rollup.config.js
        export 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.js
        const 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

        這種機制一般是通過對 noderequire 機制進行 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 規范來寫,因為還沒有注冊 hook
        require('@babel/register')({
         plugins: ['@babel/plugin-transform-modules-commonjs']
        });
        require('./index');
        
        
        # src/index.js
        import print from './print';
        
        print('index');
        
        
        # src/print.js
        export 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.js
        import print from './print';
        
        print('index');
        
        
        # src/print.js
        export 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

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        如何讓node運行es6模塊文件及其原理詳解:最新版的 node 支持最新版 ECMAScript 幾乎所有特性,但有一個特性卻一直到現在都還沒有支持,那就是從 ES2015 開始定義的模塊化機制。而現在我們很多項目都是用 es6 的模塊化規范來寫代碼的,包括 node 項目,所以,node 不能運行 es6 模塊文件就會
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 无码免费一区二区三区免费播放 | 亚洲欧洲无码AV不卡在线| 精品亚洲永久免费精品| 久久久久亚洲爆乳少妇无 | 人妻巨大乳hd免费看| 无码欧精品亚洲日韩一区夜夜嗨| 亚洲精品成a人在线观看☆| 国产人在线成免费视频| 亚洲一级特黄特黄的大片| 久久久久国色AV免费看图片| 77777午夜亚洲| 日本人护士免费xxxx视频| 日韩色日韩视频亚洲网站| 亚洲国产成人精品91久久久| 国产免费伦精品一区二区三区| 国产成人精品日本亚洲网站| 日本免费在线观看| 亚洲日本香蕉视频| 国产精品久久久久久久久久免费 | 激情五月亚洲色图| 午夜视频免费观看| 尤物视频在线免费观看| 亚洲av永久无码精品网站| 亚洲人成在线免费观看| 亚洲av无码成人精品国产| 亚洲国产高清在线一区二区三区| 二区久久国产乱子伦免费精品| 亚洲短视频男人的影院| 亚洲免费视频播放| 亚洲成AV人片高潮喷水| 中文字幕亚洲乱码熟女一区二区 | 成人av免费电影| 免费无码AV一区二区| 亚洲AV无码专区亚洲AV伊甸园| 久久精品女人天堂AV免费观看| 一级午夜免费视频| 亚洲最新中文字幕| 亚洲性日韩精品一区二区三区| 91青青青国产在观免费影视| 亚洲hairy多毛pics大全| 国产亚洲av片在线观看16女人|