Webpack有幾個和模塊化相關的loader,imports-loader
,exports-loader
,expose-loader
,比較容易混淆。今天,咱們來理一理。javascript
文檔介紹的是:用於向一個模塊的做用域內注入變量(Can be used to inject variables into the scope of a module.),官方的文檔老是言簡意賅可是不太好懂。咱們來舉個例子。
例子完整的代碼能夠點這裏jqGreen.js
文件裏僅一行代碼css
//沒有模塊化 $('#box').css('color','green');
index.js
文件也只有一行代碼java
require('./jqGreen');
咱們的配置文件中,是把index.js
做爲入口文件的。jquery
{ entry:{ index:'./src/js/index.js' } }
注意,咱們並無引入jquery
。因此運行的結果是$ is not defined
。webpack
可是若是咱們稍微修改一下jqGreen
的引入方式,就能很輕鬆的解決這個問題。index.js
文件git
require('imports?$=jquery!./jqGreen');
固然,這個能運行以前,咱們要npm install imports-loader
一下。上面代碼,把變量$
注入進模塊jqGreen.js
。同時,咱們指定了變量$=jquery
。等因而在jqGreen.js
文件的最頂上,加上了var $=require('jquery')
。這樣,程序就不會報$ is not defined
的錯誤了。github
exports有導出
的意思,這讓咱們猜想它有從模塊中導出變量的功能。實際狀況大體如此。咱們來看個小例子。
例子的完整代碼在 這裏Hello.js
文件中僅有一個方法,直接綁定在全局變量window
上面。web
window.Hello = function(){ console.log('say hello.'); }
而後咱們在index.js
文件裏去引用這個Hello.js
:var hello = require('./Hello.js');
。這樣引用的結果是變量hello
是undefined
。由於咱們在Hello.js
文件裏沒有寫module.exports=window.Hello
,因此index.js
裏咱們require
的結果就是undefined
。這個時候,exports-loader
就派上用場了。咱們只用把index.js
的代碼稍微改動一下:var hello = require('exports?window.Hello!./Hello.js');
,這個時候,代碼就能正確的運行了。變量hello
就是咱們定義的window.hello
啦。var hello = require('exports?window.Hello!./Hello.js');
這行代碼,等於在Hello.js
里加上一句module.exports=window.Hello
,因此咱們才能正確的導入。npm
把一個模塊導出並付給一個全局變量。文檔裏給了一個例子:瀏覽器
require("expose?libraryName!./file.js"); // Exposes the exports for file.js to the global context on property "libraryName". // In web browsers, window.libraryName is then available.
例子中的註釋是說把file.js中exports出來的變量付給全局變量"libraryName"
。假如file.js
中有代碼module.exports=1
,那麼require("expose?libraryName!./file.js")
後window.libraryName
的值就爲1(咱們這裏只討論瀏覽器環境)。
我這裏還有一個稍稍複雜點的從一個umd模塊的文件裏導出到全局變量的例子,有興趣的同窗點擊這裏。