webpack中imports-loader,exports-loader,expose-loader的区分

Webpack有几个和模块化相干的loader,imports-loader,exports-loader,expose-loader,比较轻易殽杂。本日,我们来理一理。

imports-loaders

文档引见的是:用于向一个模块的作用域内注入变量(Can be used to inject variables into the scope of a module.),官方的文档老是一针见血然则不太好懂。我们来举个例子。
例子完全的代码能够点这里
jqGreen.js文件里仅一行代码

//没有模块化
$('#box').css('color','green');

index.js文件也只要一行代码

require('./jqGreen');

我们的配置文件中,是把index.js作为进口文件的。

{
    entry:{
    index:'./src/js/index.js'
    }
}

注重,我们并没有引入jquery。所以运转的效果是$ is not defined

然则如果我们轻微修正一下jqGreen的引入体式格局,就可以很轻松的处理这个题目。
index.js文件

require('imports?$=jquery!./jqGreen');

固然,这个能运转之前,我们要npm install imports-loader一下。上面代码,把变量$注入进模块jqGreen.js。同时,我们指定了变量$=jquery。等于是在jqGreen.js文件的最顶上,加上了var $=require('jquery')。如许,顺序就不会报$ is not defined的错误了。

exports-loader

exports有导出的意义,这让我们猜想它有从模块中导出变量的功用。实际情况大抵云云。我们来看个小例子。
例子的完全代码在 这里
Hello.js文件中唯一一个要领,直接绑定在全局变量window上面。

window.Hello = function(){
    console.log('say hello.');
}

然后我们在index.js文件里去援用这个Hello.js:var hello = require('./Hello.js');。如许援用的效果是变量helloundefined。由于我们在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,所以我们才准确的导入。

expose-loader

把一个模块导出并付给一个全局变量。文档里给了一个例子:

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模块的文件里导出到全局变量的例子,有兴致的同砚点击这里

    原文作者:秋水易寒
    原文地址: https://segmentfault.com/a/1190000007515136
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞