<font id="zqva1"></font>
<rt id="zqva1"></rt>
  • <tt id="zqva1"></tt>
    <cite id="zqva1"></cite>

    <cite id="zqva1"><noscript id="zqva1"></noscript></cite>
      <rp id="zqva1"><meter id="zqva1"></meter></rp>

        <cite id="zqva1"></cite>
          <b id="zqva1"></b>
          <rp id="zqva1"></rp>
          <cite id="zqva1"></cite>

          <rt id="zqva1"></rt>

        1. <rp id="zqva1"></rp>

          關于 Node.js 里 ES6 Modules 的一次更新說明

          時間:?2017-11-14閱讀:?1034標簽:?node

          幾個月前,我寫了一篇文章來描述 Node.js 現存的 CommonJS 模塊和新的 ES6 模塊系統的許多不同,也說明了在 Node.js 內核中實現這個新模型的內在的一些挑戰。現在,我想分享一下關于這件事情的進展情況。


          明白你什么時候該知道你需要知道的東西

          在這之前,如果你還沒準備好,你可以花一點時間來看一下我之前的描述這兩個模塊架構上存在許多根本區別的文章。總結來說就是:CommonJS 與 ES6 Modules 之間的關鍵不同在于代碼什么時候知道一個模塊的結構和使用它。

          舉個栗子,假如我現在有一個簡單的 CommonJS 模塊(模塊名叫'foobar'):

          function foo() {
            return 'bar';
          }
          function bar() {
            return 'foo';
          }
          module.exports.foo = foo;
          module.exports.bar = bar;


          現在我們在一個叫 app.js 的 JS 文件中引用它

          const {foo, bar} = require('foobar');
          console.log(foo(), bar());


          當我執行 $node app.js 的時候,Node.js 已二進制的形式加載 app.js 文件,解析它,并且開始執行里面的代碼。在執行過程中,里面的 require() 方法被調用,然后它會同步的去加載 foobar.js 的內容進內存,同步的解析編譯里面的 JavaScript 代碼,同步的執行里面的代碼,然后返回 module.exports 的值當做 app.js 里的 require('foobar') 的返回值。當 app.js 里的 require() 方法返回的時候,foobar 模塊的結構就已經知道了,并且可以被使用。所有的這些事情都發生在 Node.js 進程事件循環的同一個周期里。

          要理解 CommonJS 與 ES6 Modules 之間的不同至關重要的是,一個 CommonJS 的模塊在沒有被執行完之前,它的結構(API)是不可知的 — 即使在它被執行完以后,它的結構也可以隨時被其他代碼修改。

          現在我們用 ES6 的寫法來寫同樣的模塊:

          export function foo() {
            return 'bar';
          }
          export function bar() {
            return 'foo';
          }


          并且在代碼中引用它:

          import {foo, bar} from 'foobar';
          console.log(foo());
          console.log(bar());


          從 ECMAScript 統一的標準來看,ES6 Modules 的步驟與 CommonJS 里已經實現的有很大的不同。第一步從硬盤上加載文件內容大致上是相同的,但是可能是異步的。當內容加載完成后,會解析它。在解析的同時,模塊里被 export 聲明定義的結構會在組件內容被執行之前就探知出來。一旦結構被探知出來,組件的代碼就會被執行。這里重要的是記住所有的 import 和 export 語句都會在代碼執行之前被解析出來。另一點是在 ES6 中是允許這個解析的步驟異步執行的。這就意味著,在 Node.js 的機制中,加載腳本內容、解析模塊的 import 和 export 、執行模塊代碼將發生在多個事件循環里。


          時機很重要

          在評估 ES6 Modules 的可實現性之前,我們關注的重點是怎么樣無縫銜接的實現它。比如我們希望它可以可以實現同時對兩種模塊的支持,這樣可以很大程度上對用戶是透明的。

          可惜,事情并不是這么簡單…

          尤其是 ES6 Modules 的加載、解析和執行都是異步的,這就導致不能通過 require() 來引用一個 ES6 模塊。原因是 require() 是一個完全同步的函數。如果我們去修改 require() 的語義讓它可以進行異步加載的話,那對于現有的生態系統將會產生巨大的破壞。所以我們有考慮在 ES6 的 import() 函數提議(詳情)通過之后建模實現一個 require.import() 函數。這個函數會返回一個 Promise 在 ES6 模塊加載完成后標記完成。這不是最好的方案,但是它可以讓你在現有的 Node.js 里以 CommonJS 的格式來使用。

          有一點好消息是在 ES6 模塊里可以很方便地使用 import 來引用一個 CommonJS 模塊。因為在 ES6 模塊里異步加載不是必須的。ECMAScript 規范進行一些小修改就可以更好地支持這種方式。但是所有這些工作過后,還有一個重要的事情…


          命名引用

          命名引用是 ES6 Modules 里的一個基本的特性。舉個例子:

          import {foo, bar} from 'foobar';


          變量 foo 和 bar 在解析階段就從 foobar 中被引用進來 —— 在所有代碼被執行之前。因為 ES6 Modules 的結構是之前就可以被探知到的。

          另一方面,在 CommonJS 里模塊結構在代碼沒有執行之前是不能被探知的。也就是說,如果不對 ECMAScript 規范做重大更改的話,在 CommonJS 模塊里是不能使用命名引用的。開發者會引用到 ES6 Modules 里面的名為 “default” 的導出。比如,上面的例子在 CommonJS 里是這樣的:

          import foobar from 'foobar';
          console.log(foobar.foo(), foobar.bar());


          區別很小但是很重要。所以當你想使用 import 來引用一個 CommonJS 模塊的時候,下面這種寫法是根本行不通的:

          import {foo, bar} from 'foobar';


          這里的 foo 和 bar 不會直接被解析成 CommonJS 模塊里導出的 foo() 和 bar() 方法。


          但是在 Babel 里可以!

          使用過像 Babel 這種的 ES6 Modules 語法轉換工具的人應該很熟悉命名引用。Babel 的工作原理是把 ES6 的寫法轉換成可以在 Node.js 里運行的 CommonJS 的形式。雖然語法看起來很像 ES6,但是實際上并不是。這一點很重要,Babel 里的 ES6 命名引用與完全按照規范實現的 ES6 命名引用有本質的不同。


          Michael Jackson Script

          實際上CommonJS 和 ES6 Modules 之間還有另外一個重要的不同就是,ECMAScript 編譯器必須提前知道它加載的代碼是 CommonJS 的還是 ES6 Modules 的。原因是之前說的 ES6 Modules 必須在代碼執行前就解析出模塊中的 import 和 export 聲明。

          這就意味著 Node.js 需要某些機制來預先識別它在加載那種類型的文件。在探索了很多方案以后,我們回歸到了以前最糟糕的方案,就是引入一個新的 *.mjs 文件后綴來表示一個 ES6 Modules 的 JavaScript 文件。(之前我們親切的叫它 “Michael Jackson Script”)


          時間線

          在目前的時間點上,在 Node.js 可以開始處理支持實現 ES6 Modules 之前,還有很多關于規范現實的問題和虛擬機方面的問題。相關工作還在進行,但是需要一些時間 —— 我們目前估計至少需要一年左右。


          原文鏈接: An Update on ES6 Modules in Node.js 
          譯文來源:aotu.io
          站長推薦

          1.阿里云: 本站目前使用的是阿里云主機,安全/可靠/穩定。點擊領取2000元代金券、了解最新阿里云產品的各種優惠活動點擊進入

          2.騰訊云: 提供云服務器、云數據庫、云存儲、視頻與CDN、域名等服務。騰訊云各類產品的最新活動,優惠券領取點擊進入

          3.廣告聯盟: 整理了目前主流的廣告聯盟平臺,如果你有流量,可以作為參考選擇適合你的平臺點擊進入

          鏈接: http://www.modern-decoration.com.cn/article/detial/104

          前端學nodejs有什么用處?

          Node.js是一個基于 Chrome V8 引擎的 JavaScript 運行環境,一個基于Chrome JavaScript運行時建立的平臺, 用于方便地搭建響應速度快、易于擴展的網絡應用。

          怎么卸載nodejs?

          Node.js是一個Javascript運行環境,可以使Javascript這類腳本語言編寫出來的代碼運行速度獲得極大提升,那么安裝后該如何卸載呢?下面本篇文章就來給大家介紹一下Windows平臺下卸載node.js的方法,希望對大家有所幫助。

          使用nodejs的好處

          Node.js是一個Javascript運行環境。Node.js 使用事件驅動, 非阻塞I/O 模型而得以輕量和高效,非常適合在分布式設備上運行數據密集型的實時應用。Node.js是單進程、單線程運行機制,通過事件輪詢

          怎么徹底刪除nodejs?

          Node.js 是一個基于Chrome JavaScript 運行時建立的一個平臺。Node.js是一個事件驅動I/O服務端JavaScript環境,基于Google的V8引擎,V8引擎執行Javascript的速度非常快,性能非常好。

          nodejs適合做什么?

          面對一個新技術,多問幾個為什么總是好的。既然 PHP、Python、Java 都可以用來進行后端開發,那么為什么還要去學習 Node.js?Node.js適合做什么?Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環境,一個讓 JavaScript 運行在服務端的開發平臺。

          理解 nodeJS 中的 buffer,stream

          在Node.js開發中,當遇到 buffer,stream,和二進制數據處理時,你是否像我一樣,總是感到困惑?這種感覺是否會讓你認為不了解它們,以為它們不適合你,認為而這些是Node.js作者們的事情?

          什么是node repl?

          Node REPL(Read Eval Print Loop)是Node自帶的交互式解釋器(又名Node shell),表示一個電腦的虛擬環境,類似 Window 系統的終端或 Unix/Linux shell,我們可以在終端中輸入命令,并接收系統的響應。

          node怎么更新升級?

          如果你的node安裝的比較早,現在最新的版本比自己安裝的高,則可以通過升級的方式更新到指定的版本和最新的版本。下面本篇文章就來給大家介紹windows下和linux更新升級node版本的方法。

          node modules是什么?

          在node.js中modules(模塊)與文件是一一對應的,也就是說一個node.js文件就是一個模塊,文件內容可能是我們封裝好的一些JavaScript方法、JSON數據、編譯過的C/C++拓展等,在關于node.js的誤會提到過node.js的架構

          node如何更新?

          node的更新方法:先使用npm的命令npm install -g n安裝n模塊,然后使用n stable可以將node更新到最新版本,使用n+node版本號可以將node更新到指定版本。

          內容以共享、參考、研究為目的,不存在任何商業目的。其版權屬原作者所有,如有侵權或違規,請與小編聯系!情況屬實本人將予以刪除!

          文章投稿關于web前端網站點搜索站長推薦網站地圖站長QQ:522607023

          小程序專欄: 土味情話心理測試腦筋急轉彎幽默笑話段子句子語錄成語大全運營推廣

          国产精品高清视频免费 - 视频 - 在线观看 - 影视资讯 - 唯爱网