語言和環境是兩個不同的概念,提及JavaScript,你可能會想到瀏覽器。沒錯,瀏覽器是JavaScript語言的搖籃,也是它的棲息地之 一。脫離了環境,JavaScript程式碼是不能夠執行的,學習JavaScript語言也失去了應用的價值。這與其他系統級的語言有着很大的不同。例 如,C語言可以開發系統,製造環境,而JavaScript只能夠寄生在某個具體的環境中才能 纔能夠工作。
JavaScript 執行環境一般都由宿主環境和執行期環境共同構成。
宿主環境:由外殼程式生成,如Web瀏覽器就是一個外殼程式,它提供了一個可控制瀏覽器視窗的宿主環境。
執行期環境:由嵌入到外殼程式中的JavaScript引擎(或稱爲JavaScript直譯器)生成,在這個環境中 JavaScript能夠生成內建靜態物件,初始化執行環境等。
Reference:
Node 是一個基於Chrome V8 引擎的JavaScript 執行環境。
Reference:
瀏覽器端的模組系統無法使用,不只是 require,即使 es6 標準中的 import 也無法支援。(nodejs支援的模組化規範是Commonjs,不支援ES6的module)。
原因在於目前模組之間依賴樹的處理方法上還有一個明顯的難題沒有解決:
因爲只有在瀏覽器完全下載完一個 js 檔案,並且宿主引擎解析到 require 或 import 這些關鍵字的時候,才知道還有依賴需要下載並解析。然而該檔案依賴的這個模組可能還依賴於其他模組,理論上依賴樹可以有無限長,目前這種依賴的同步載入方式無疑會帶來嚴重的進程阻塞和極高的網路開銷。
目前並沒有很好的解決方案使瀏覽器端自然地使用各個模組系統,只能使用 webpack ,rollup 和 browserify 等工具預先將所有依賴打包,最終在瀏覽器環境中執行。
當然,也可以自己寫一個 require 函數,或者使用 require.js、sea.js 這種前端模組載入庫。
拓展: