Hi 大家好
昨天我們回到了最一開始讀不懂的 package.json
試著使用我們這幾週學到的知識,是否可以應用在讀懂 vue-cli 的 boilerplate
這邊有兩個檔案,build/webpack.dev.conf.js
和 build/build.js
build/webpack.dev.config.js
,他是我們 npm run dev
時所使用的設定檔
而 build/build.js
,我們則會把它應用在 npm run build
就是我們要打包出實際上 production 環境的 code
(因為編譯要很久,我們一般開發都是使用 npm run dev
)
這邊,就讓我們一起來讀懂 source code 吧!
webpack.dev.conf.js
'use strict'
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')
const HOST = process.env.HOST
const PORT = process.env.PORT && Number(process.env.PORT)
const devWebpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
},
// cheap-module-eval-source-map is faster for development
devtool: config.dev.devtool,
// these devServer options should be customized in /config/index.js
devServer: {
clientLogLevel: 'warning',
historyApiFallback: true,
hot: true,
compress: true,
host: HOST || config.dev.host,
port: PORT || config.dev.port,
open: config.dev.autoOpenBrowser,
overlay: config.dev.errorOverlay
? { warnings: false, errors: true }
: false,
publicPath: config.dev.assetsPublicPath,
proxy: config.dev.proxyTable,
quiet: true, // necessary for FriendlyErrorsPlugin
watchOptions: {
poll: config.dev.poll,
}
},
plugins: [
new webpack.DefinePlugin({
'process.env': require('../config/dev.env')
}),
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true
}),
]
})
module.exports = new Promise((resolve, reject) => {
portfinder.basePort = process.env.PORT || config.dev.port
portfinder.getPort((err, port) => {
if (err) {
reject(err)
} else {
// publish the new Port, necessary for e2e tests
process.env.PORT = port
// add port to devServer config
devWebpackConfig.devServer.port = port
// Add FriendlyErrorsPlugin
devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
compilationSuccessInfo: {
messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
},
onErrors: config.dev.notifyOnErrors
? utils.createNotifierCallback()
: undefined
}))
resolve(devWebpackConfig)
}
})
})
他的原始碼不太長,我們來慢慢看
我們這邊來先把 webpack.dev.conf.js
前面設定的 const
(常數) 來一個一個看
這邊我有做了一些整理
use strict
'use strict'
是在 ES5 中提出的標準
如果你在程式碼的開頭加上 'use strict'
你的 JavaScript runtime 會選擇以另一種方式來執行你的 JavaScript code
像是原本有些錯誤發生時,JavaScript 會盡可能不讓程式掛掉,而繼續執行
而在 strict mode
下,原本 JavaScript 允許的語法有些會被阻擋
並且讓執行出來的程式比較快
use strict
的問題不過 use strict
有個問題,跟他本身的功能無關
而是 use strict
這個改動,會讓很多原本會動的語法失效
還記得我們在前幾天提到,實作標準很重要的一點 -「向後相容」吧!
基本上加入 use strict
後,有很大機會不相容於原本的 code
所以讓許多已經完成的專案會很難帶入
這也是為甚麼 use strict
在 ES5 就提出了,卻現在還沒有到廣為使用
想深入研究的話,可以上網去查
我覺得最終任何能優化 JavaScript 的功能應該都會普及
只是用法可能不如我們預料
use strict
的用途現在除非是比較小型的專案
不然由於開發者的熟悉度,我目前看到有使用 use strict
的比較少
不過在我們研究 webpack 時,可以看到有些地方有用上
像是 webpack 編譯出來的結果
就有一部分是使用 use strict
這很讓人理解,因為自動產生的 code ,只要規則對,很容易可以融入 use strict
npm
上也有些專案可以把編譯出來的每個 module 都使用 strict mode
webpack.dev.confg.js
要使用 strict mode
至於我發現 webpack.dev.config.js
明明不是編譯出來
卻使用 use strict
的想法
追查的結果,是在 https://github.com/vuejs-templates/webpack/commit/17ed63b 這筆 commit 追加的功能
(小知識#1, GitHub 網址的 commit 是可以縮寫成 7 位的)
(小知識#2, 可以善用 git blame
來查看該行的更改紀錄)
有興趣的可以去 https://github.com/vuejs-templates/webpack/pull/801 看這筆 pull request
基本內容是,原本 template 裡面有限制 node 版本
所以使用 const 跟 let 應該比較漂亮
不過在早些版本的 node (應該是 4 版)
那時候 let 還不允許寫在 function 內
所以那時候打算使用 use strict
來解決這個問題
講一講 use strict
今天時間就沒了
我們明天就來介紹他使用了哪些套件吧!