升級webpack4,必定要去看文檔,特別是更新說明,不要自持用過本來webpack就本身開始折騰。折騰到後面,可能就默默流下眼淚了。css
webpack-cli被單獨拆了出來,使用的時候若是隻是全局裝了CLI,直接執行的時候是能夠的。node
webpack --config ./config/webpack.dev.js
複製代碼
若是是寫在npm hook裏面會發現有點問題:jquery
//package.json
"scripts": {
"dev": "webpack --config ./config/webpack.dev.js"
}
//shall
npm run dev
複製代碼
此時就會給提示:webpack
One CLI for webpack must be installed. These are recommended choices, delivered as separate packages:
- webpack-cli (https://github.com/webpack/webpack-cli)
The original webpack full-featured CLI.
- webpack-command (https://github.com/webpack-contrib/webpack-command)
A lightweight, opinionated webpack CLI.
We will use "npm" to install the CLI via "npm install -D".
Which one do you like to install (webpack-cli/webpack-command):
複製代碼
若是是我沒有全局裝,我確定會意識到要選一個,這個坑關鍵是我全局裝了。因此就在那折騰半天。
其實官方文檔開頭就說明了。git
npm install webpack webpack-cli --save-dev
複製代碼
安裝完成以後,繼續執行發現有warning:github
WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/concepts/mode/
複製代碼
配置規則:必須在production 和 development之間選擇一種,以便webpack 使用相應模式的內置優化web
用法:npm
配置文件中:json
module.exports = {
entry: Entrys,
mode: 'development'
}
複製代碼
cli 參數傳入api
webpack --mode=development
複製代碼
兩種方式都是可行的,不過我遇到過一個很坑的問題,困擾本身好幾天,最後知道真相的本身眼淚掉下來後面再提這個問題。
由於一直被吐槽配置太累,加上parcel給的壓力,webpack4也支持零配置打包了。 若是沒有配置文件,會默認以./src/index.js做爲entry開始打包。 若是配置了webpack.config.js或者指定了--config 的文件路徑,則依據對應配置文件開始。
在webpack.config.js中配置了entry、mode等相關屬性,配置文件以下:
module.export = {
mode:'production',
entry:{
app:'./src/test.js',
index:'./src/test.js'
},
output: {
path: process.cwd() + '/dist',
filename: '[name].[hash].js',
chunkFilename: '[name].[chunkhash].js',
crossOriginLoading: 'anonymous'
},
cache: true,
devtool: 'cheap-source-map',
externals: {
jquery: 'jQuery'
},
module: {
rules: [
{
test: /\.(js|jsx)?$/,
include: [
path.resolve(__dirname, "../src")
],
exclude: [
'node_modules',
path.resolve(__dirname, "../node_modules")
],
use: [
{
loader: 'babel-loader',
options:{
presets:['es2015']
}
}
]
}
]
},
resolve: {
modules: [
'node_modules'
],
extensions: [".js", ".json", ".jsx", ".css"],
},
devServer: {
proxy: { // proxy URLs to backend development server
'/api': 'http://localhost:3000'
},
contentBase: path.resolve(__dirname, "../dist"),
hot: true,
open:true
},
plugins: [
new CleanWebpackPlugin(['dist']),
new HtmlWebpackPlugin({
title:'test'
}),
new webpack.HotModuleReplacementPlugin()
]
}
複製代碼
package.json命令配置:
"scripts": {
"build": "webpack --config webpack.prod.js"
}
//執行打包
npm run build
複製代碼
發現始終會有上面選擇mode類型的提示,這讓人不能接受,另外提示沒有./src/index.js文件,可是個人配置入口是別的文件,這樣讓人很莫名
ERROR in Entry module not found: Error: Can't resolve './src' in '/Users/****' 複製代碼
本着跟着提示解決問題的原則,少文件那就建一個唄(後來發現這種思惟有時候有用,有時候還真要慎重),問題表現雖然一致,實質可能有所不一樣。 新建以後是能夠運行了可是咱們的配置文件好像沒起做用, dist下的打包文件是默認的main.js 而非咱們指定的app和index 爲了確保進入配置文件,我打了幾個log,居然都有輸出,說明進去了,這問題就詭異了。
console.log(path.resolve(__dirname, './src')) //輸出正確路徑
module.export = {
//*****//
}
複製代碼
初步猜測是版本問題,確實也有issue上提到過某些版本存在問題,對照着官方demo鎖定版本以後問題依然存在。 猜想:應該是配置文件存在錯誤
將官方最基本的配置拉進來拷貝進來試了一下,依然存在問題沒能解決。 猜想:本地的環境存在問題,npm,node等版本 查看以後發現版本都是知足的。
將demo拉到本地並啓動,demo正常打包,說明本地環境是ok的。那麼問題就明顯了,個人配置文件或者項目搭建有問題,對照着demo的配置項,配置項沒有明顯問題,這樣的話將,配置信息放入到demo中去,修改以後發現起做用,我又從新審視了下個人配置文件,不只僅侷限於配置部分的時候,發現
//個人寫法,這樣webpack拿到的就是undefined了。
module.export
//別人的demo
module.exports
複製代碼
webpack會將 webpack --config 傳入的文件與自己默認配置進行merge,保證自己打包不出錯。爲了證實咱們的推論,將配置文件只剩下output屬性,並加上src/index.js
module.exports = {
output: {
path: process.cwd() + '/dist1',
// 直接的入口模zzz塊名
filename: '[name].js',
// 非入口模塊,也就是不須要打包到一塊兒的,但又可能會用到,
// 這不就是按需加載的麼
chunkFilename: '[name].[chunkhash].js',
crossOriginLoading: 'anonymous'
}
}
複製代碼
執行以後會發現打包到/dist1下面。因此上面寫錯module.exports的時候,走的徹底是默認配置。前面的log打在了module.exports以前執行是正確的。
當遇到難以想象的問題的時候,建議靜下心看一看,不要盲目搜索,另外最可靠的參考就是官方文檔和實例,注意對比版本和環境,若是都沒問題,那麼再去嘗試網上的各類解決方法。 這裏總結一下給本身一個記錄,但願解決思路能幫助其餘人。