最近自己在練習寫React,Vue的時候,會在不同的子元件中多次import同一個檔案,例如:import React from 'react'
、import Vue from 'vue'
,引入的次數多了慢慢讓我產生了疑惑,引入這麼多次,webpack會多次打包嗎?直覺告訴我webpack並不傻,不會愚蠢的打包多次使打包後的檔案異常臃腫,如果不會的話為什麼不會呢?懷著好奇心在谷歌搜尋很久也沒有找到讓我信服的的答案,於是我自己做了個實驗(原始碼),來證明自己的猜想:
1.模擬react/vue環境
第一步是安裝相關webpack、babel等相關依賴以及建好目錄 webpack設定:
//webpack.config.js
module.exports = {
entry: './app.js',
output: {
filename: 'bundle.js'
},
module: {
loaders:[
{
test: /\.js[x]?$/,
exclude: /node_modules/,
loader: 'babel-loader?presets[]=es2015&presets[]=react'
},
]
}
}
複製程式碼
package.json所需依賴:
//package.json
{
"name": "test",
"version": "0.0.1",
"devDependencies": {
"webpack": "^1.14.0"
},
"dependencies": {
"babel-core": "^6.21.0",
"babel-loader": "^6.2.10",
"babel-preset-es2015": "^6.18.0",
"babel-preset-react": "^6.16.0"
}
}
複製程式碼
其他用於測試的檔案:
//demo.js--相當於vue
export default {
test(argu) {
console.log(argu)
}
}
//test1.js --相當於某個元件
import demo from './demo'
export default {
test1() {
demo.test(1)
}
}
//test2.js --相當於另一個元件
import demo from './demo'
export default {
test1() {
demo.test(2)
}
}
//add.js --入口檔案
import Test1 from './test1'
import Test2 from './test2'
Test1.test1()
Test2.test2()
複製程式碼
我在test1.js
,test2.js
中都引入demo.js
,並且exoprt 出依賴demo.js
的方法,然後再在app.js
中引入test1.js
,test2.js
webpack打包後開啟bundle.js,找到demo部分。
bundle.js
中引入的檔案都被分成了帶有序號(num)的“程式碼片”,通過__webpack_require__(num)
來引入對應的模組,而我們import兩次用來測試的demo.js
也只是被打包成了序號為2的程式碼塊,由此我們可以推論出:
不同檔案中多次import同一個檔案,webpack並不會多次打包,只會在打包後的檔案中會多次引用打包後的該檔案對應的函式。
問題終於搞清楚了,很舒服!!?