iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 27
1
Modern Web

平時沒注意的 JavaScript - JS 生態系及週邊工具整理系列 第 28

深入探索 vue-cli,讓我們來看看 build/build.js 與 build/webpack.dev.conf.js 做了些什麼!

  • 分享至 

  • xImage
  •  

Hi 大家好

昨天我們回到了最一開始讀不懂的 package.json

試著使用我們這幾週學到的知識,是否可以應用在讀懂 vue-cli 的 boilerplate

這邊有兩個檔案,build/webpack.dev.conf.jsbuild/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 時,可以看到有些地方有用上

編譯後的 code

像是 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 來解決這個問題

https://stackoverflow.com/questions/33001246/uncaught-syntaxerror-block-scoped-declarations-let-const-function-class-no/33001437

明天

講一講 use strict 今天時間就沒了

我們明天就來介紹他使用了哪些套件吧!


上一篇
回歸原點 - 來看看當初看無的 vue-cli 吧!
下一篇
webpack.dev.conf.js 深入探究 - (2)
系列文
平時沒注意的 JavaScript - JS 生態系及週邊工具整理33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言