這篇文章主要介紹了詳解webpack解惑:require的五種用法,具有一定的參考價值,有興趣的小夥伴們可以參考一下
webpack中可以寫commonjs格式的require同步語法,可以寫AMD格式的require回呼語法,還有一個require.ensure,以及webpack自己定義的require.include,再加上ES6的import語法,這麼多豈不是會把人搞亂。本篇就來梳理一下這些require各自的特點,以及都在什麼場景下使用。
commonjs同步語法
經典的commonjs同步語法如下:
var a = require('./a'); a.show();
此時webpack會將a .js打包進引用它的檔案中。這是最普遍的情形,不必贅述。
commonjs非同步載入
在commonjs中有一個Modules/Async/A規範,裡面定義了require.ensure語法。 webpack實現了它,作用是可以在打包的時候進行程式碼分片,並非同步載入分片後的程式碼。用法如下:
require.ensure([], function(require){ var list = require('./list'); list.show(); });
此時list.js會被打包成一個單獨的chunk文件,大概長這樣:
1.fb874860b35831bc96a8.js
可讀性比較差。我在上一篇結尾也提到了,給它命名的方式,那就是給require.ensure傳遞第三個參數,如:
##
require.ensure([], function(require){ var list = require('./list'); list.show(); }, 'list');這樣就能得到你想要的檔案名稱:list.fb874860b35831bc96a8.js你也可以傳入像"question/list"這樣帶層級的名字,這樣webpack會依照層級給你建立資料夾。 要注意的是,如果你在require.ensure的
函數中引用了兩個以上的模組,webpack會把它們打包在一起,例如:
#
require.ensure([], function(require){ var list = require('./list'); list.show(); var edit = require('./edit'); edit.display(); }, 'list_and_edit');list.js和edit.js將會被打包成一個文件,並命名為list_and_edit.js。這就需要根據你的實際情況來衡量了,如果你不希望打包在一起,只能寫兩個require.ensure分別引用這兩個文件。 多說一句,這種思維其實我是很不喜歡的,在程式設計階段卻要對打包的事情做出決策,明顯違背了職責分離原則。
commonjs預先載入懶執行
在上面的用法中,我們給require.ensure的第一個參數傳了空數組,實際上這裡是可以接收模組名稱的,作用就是實作預先載入懶執行。用法如下:require.ensure(['./list'], function(require){ var list = require('./list'); list.show(); });給require.ensure的第一個參數傳了['./list'],執行到這裡的時候list.js會被瀏覽器下載下來,但並不會執行list.js模組中的程式碼,也就是webpack官網說的,不會進行evaluate。真正進行evaluate的時候是到了後面這句var list = require('./list');這就是所謂的懶執行。 寫在函數中的多個模組會被打包在一起,這一點和上面沒有區別。另外,寫在陣列中的模組也會跟他們打包在一起,不管你有沒有手動執行。 這種寫法也是有點彆扭的,像是commonjs和AMD的結合體,而且一個模組名稱還要寫兩次,真是不夠優雅。所以webpack自己定義了一個方法,能夠實現預先載入。
webpack自帶的require.include
require.include是webpack自己提供的,並沒有什麼規範做後台,所以是個小角色。它可以實作上面是預先載入功能,而不用把模組寫在陣列中,用法如下:
#
require.ensure([], function(require){ require.include('./list');//此处只加载不执行 });根據webpack官網文檔介紹,require.include還有一個作用是能把子模組中的公共部分,提取到父模組中,例如child1和child2都引用了list.js這個模組,那麼如果在parent中include了list.js,那麼子模組中的就會被刪掉,相當於提升到了父模組中。 (這裡所謂的父子關係是指引用關係)這個方法官方也是一筆帶過,看來也是一個雞肋的東西,用處不大。因為我發現require.include的回傳值是undefined,也就是說,如果你想使用模組,姿勢是這樣的:
require.ensure([], function(require){ require.include('./preview'); //加载 let p = require('./preview'); //执行 p.getUrl(); //使用 }, 'pre');
AMD非同步載入
webpack既支援commonjs規範也支援AMD規範,這意味著AMD的經典語法是可以正常使用的,如:##
require(['./list'], function(list){ list.show(); });
當然,這樣寫的話list.js也是被單獨打包成一個檔案的。與上面類似,如果你在這裡寫了多個模組,那麼這些模組都會被打包成一個文件,如:
require(['./list', './edit'], function(list, edit){ list.show(); edit.display(); });
list.js和edit.js會被打包在一起。不同的是,AMD的方式無法傳入第三個參數當檔名,所以得不到很好看的檔案。 ES6 import
这年头不用ES6都不好意思跟人打招呼。所以我们的代码中,又会多一种模块引入语法,那就是import。import会被转化为commonjs格式或者是AMD格式,所以不要把它认为是一种新的模块引用方式。babel默认会把ES6的模块转化为commonjs规范的,你也不用费劲再把它转成AMD了。 所以如下写法是等价的: 不过这两种写法只需选一种,避免在代码中同时使用两种,否则会造成混淆。 总结 以上把require的用法捋了一遍,明白了各自用法的区别之后,我们就可以在项目中进行选择了。我觉得最佳选择是往commonjs方向靠拢,想尝试ES6的话就用import代替commonjs同步语法即可。 因此,代码中保持以下两种风格就好: 很显然,你在写代码的时候还是需要对打包结果进行决策,这是我不喜欢webpack的原因。gulp那样多好,编码就是编码,编译就是编译,分开来。不过这就是webpack以模块为核心的打包方式的特点吧,仁者见仁,只要团队内做一个约定,也不会打的一塌糊涂。import list from './list';
//等价于
var list = require('./list');
//可打包在一起的同步代码,使用import语法
import list from './list';
//需要独立打包、异步加载的代码,使用require.ensure
require.ensure([], function(require){
var list = require('./list');
});
以上是require的五種用法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

記事本++7.3.1
好用且免費的程式碼編輯器