webpack入門教程(一)
5748 ワード
注:本論文の重点は、
ファイル
最初の関数:
2番目の関数:
webpack.config.js
をどのように構成し、対応する機能を実現するのではなく、webpackコンパイル前とコンパイル後のファイルを対比して、webpackパッケージ後のファイルはどのようにロードされて実行されるかを探究する.本明細書では、commonJS
のモジュール化方式について議論する場合、webpack
のパッキング作業を行う.討論を容易にするために、非常に簡単な例を用意しました.ファイル
a.js
module.exports ={
say:function(){
console.log('A is saying.');
}
}
ファイルb.js
module.exports ={
say:function(){
console.log('B is saying.');
}
}
ファイルindex.js
var a = require('./a');
var b = require('./b');
a.say();
b.say();
依存関係は非常に簡単で、すなわちindex.js
ファイル依存性a.js
とb.js
の2つのファイルです.また、common JS方式で引用しています.私のconfig
ファイルも貼ってください.var htmlPlugin = require('html-webpack-plugin');
module.exports = {
entry:{
index:'./src/index.js'
},
output:{
path:'builds',
filename:'[name].js',
chunkFilename:'chunk.[name].js'
},
plugins:[
new htmlPlugin({
filename:__dirname+'/builds/index.html',
template:'./index.html'
})
],
devServer:{
contentBase:'./builds',
inline:true
}
}
もう一つの非常に簡単なindex.html
ファイルがあります.
commonJS
また、本質問のコード例はすでにGithub
に載せられています.ここをクリックして確認してください.私たちはカタログの下でwebpack
コマンドを実行します.buildsフォルダのファイルはwebpackで処理されたファイルです.私たちが検討するポイントです.ファイルディレクトリを見に来ました.builds
里は、コンパイルされたファイルで、srcには、私たちのオリジナルファイルです.a.js
とb.js
は?builds/index.js
ファイルに包装しました.包装とはこれをするもので、複数のファイルを一つまたは少数のファイルに統合します.私たちはbuilds/index.js
をつけて、コードが変更されたことを発見しました.みんなはここをクリックして完全なコードを見て、下は一部分です.(function(modules){
var installedModules = {};
function __webpack_require__(moduleId) {/* */}
/* */
return __webpack_require__(0);
})([
// index.js
function(module, exports, __webpack_require__){
var a = __webpack_require__(1);
var b = __webpack_require__(2);
a.say();
b.say();
},
// a.js
function(module, exports){
module.exports ={
say:function(){
console.log('A is saying.');
}
}
},
// b.js
function(module, exports){
module.exports ={
say:function(){
console.log('B is saying.');
}
}
}
])
上記のコードでは、私たちのindex.js
、a.js
、b.js
が一つの配列に入れられています.入口ファイル(index.js
)は、配列の0
の位置にあります.エントランスファイルの依存性(a.js
およびb.js
)は、依存する状況に応じて後席に配置されます.この配列はIIFの関数としてのパラメータmodules
としてfunction
に入力される.匿名関数のreturn __webpack_require__(0);
は、配列の最初の関数を実行します.最初の関数:
function(module, exports, __webpack_require__) {
var a = __webpack_require__(1);
var b = __webpack_require__(2);
a.say();
b.say();
}
同前webpack_リキュール(1)つまり、行列の2番目の関数を実行します.2番目の関数:
function(module, exports) {
module.exports ={
say:function(){
console.log('A is saying.');
}
}
}
第二の関数の実行後の結果は、module.exports
の内容を変数a
に付与したものである.ここに来て、コードの構造は分かりましたが、肝心な__webpack_require__
方法はどのように働きますか?コードを解析します.
function __webpack_require__(moduleId) {
// Check if module is in cache
if(installedModules[moduleId])
return installedModules[moduleId].exports;
// Create a new module (and put it into the cache)
var module = installedModules[moduleId] = {
exports: {},
id: moduleId,
loaded: false
};
// Execute the module function
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
// Flag the module as loaded
module.loaded = true;
// Return the exports of the module
return module.exports;
}
ここでは、modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)
行のコードに注意します.modules
は先ほど私たちが話した配列です.modules
は、モジュールのコンテキスト、すなわちmodule
である.したがって、もし私たちがmodule.exports
リガでthis
という言葉を使ったら、最終的にはこれはindex.js
と同じです.さらに、this.name='jack'
という属性にもアクセスできます.これは実際の役割ではなく、理解を深めるだけです.例えば、module.exports.name='jack'
にいます. module.exports ={
say:function(){
console.log('A is saying.');
console.log(module.id);
}
}
は、モジュールを出力することができるmodule.id
です.もっと言ってください.もしa.js
を使うと、他のファイルに入れます.これはid
より大きくなります.使用可能なwebpack-dev-server
属性があります.私達のモジュールは初めて実行する時、id
かmodule.loaded
か、実行後にmodule.loaded
に設定されます.たとえば、下記のコード:false
if (module.loaded) {
var a = require('./a');
a.say();
} else {
var b = require('./b');
b.say();
}
私達の例では、これは実行毎の結果であり、true
モジュールのコードを実行する度に初めて実行されるので、index.js
です.実際の開発では、現在のコードが初めて実行されるかどうかを判断する必要があります.もう一つ重要な変数があります.私たちがロードしたモジュールのB is saying.
オブジェクトは、installed Modules[moduleId]に保存されます.このようにして、次回呼び出されたら、直接index.js
に戻ります.OKです.今回はここまでにします.学生たちの勉強を理解してください.