Chapter5: Webpack

This section contain the following items:

  • 1.Webpack Howto

  • 2.Webpack.config.js

  • 3.Webpack preloaders, loaders, postloaders

  • 4.Webpack Plugins

  • 5.Webpack & Angular

  • 6.Webpack & React Hot Reloader

1.Webpack Howto

以下參考自https://github.com/petehunt/webpack-howtoarrow-up-right:

1.What is webpack?

    (1)可做到bowswerify可做到的, 但是可以分散封裝專案使用的程式碼,使載入頁面時只需載入當頁所需的程式碼以加速載入速度,以下兩行指令的效果是相同的:
        browserify main.js > bundle.js
        webpack main.js bundle.js
    Webpack 提供比 browserify 更多的功能,一般來說會創建一個名為 webpack.config.js 的檔案來做集中管理:
        // webpack.config.js
        module.exports = {
          entry: './main.js',
          output: {
            filename: 'bundle.js'       
          }
        };

    (2)用來取代grunt&gulp, 因為webpack可以build跟bundle css, preprocess css, compile-to-JS languages and images, among other things.

    (3)其他還有:
        ->可同時整合 CommonJS 和 AMD 模組
        ->轉換 JSX, Coffee Script, TypeScript 等
        ->整合樣式表 (css, sass, less 等)
        ->建置 production-ready 的程式碼 (壓縮)

2.How to invoke webpack?

3.Compile-to-JS languages:

4.Stylesheets and images:

5.Feature flags (特定功能標籤)

6.Multiple entrypoints (分批進入)

7.Optimizing common code

8.Async loading

reference: 1. https://github.com/petehunt/webpack-howtoarrow-up-right 2. https://rhadow.github.io/2015/03/23/webpackIntro/arrow-up-right

2.Webpack.config.js

2.1 設定不同的環境變數: test, build(production)

reference:

1.https://medium.com/@brianhan/use-this-npm-variable-as-a-flag-for-your-build-scripts-31069f5e2e57#.ae34blmqtarrow-up-right

2.https://docs.npmjs.com/misc/scripts#current-lifecycle-eventarrow-up-right

2.2 Export config

3.Webpack preloaders, loaders, postloaders

Using loaders: http://webpack.github.io/docs/using-loaders.htmlarrow-up-right

1.preloaders,

2.loaders

4.Webpack Plugins

  • Extract Text Plugin:

    • webpack中CSS是可以被require()的,webpack 會自動生成一個style標籤並加入到 html的head中

    • ExtractTextPlugin可輸出打包成一包的css, 一般來說會用在production的時候

  • HtmlWebpackPlugin: 可以動態組成index.html

    • CopyWebpackPlugin:

      copies individual files or entire directories to the build directory.

    • NoErrorsPlugin

    • DedupePlugin

    • UglifyJsPlugin

      5.Webpack & Angular

      5.1 Environment

      5.2 Webpack.config.js

      (1)Add 2 things into webpack.config.js: 'use strict'; var webpack = require('webpack'); (2)Add 3 thing in module.exports = {}: (2.1) Entry: 告訴webpack打包的進入點 (2.2) Output: filename: 指定webpack打包後所產出的檔案名稱 path: 指定webpack打包後所產出的檔案的路徑 (2.3) Module: loaders: 指定Loader的種類 (3)Add loaders to webpack.config.js (4)Example: var webpack = require('webpack');

5.3 Directive and Webpack

6.Webpack & React Hot Reloader

  • 1.Introduction

    • 雖然使用webpack有很多優點, 但比較不便利的地方是更新完必須重新build bundle.js, 再重新啟動node.js, 重新reload, 造成開發上的不方便.

    • Hot Reloader的目的在於一旦有更新檔案, Webpack可以自己重build, Browser可接到訊息並reload.

    • 要讓Webpack做到Hot Reload有兩種方式:

      • 一種是使用webpack-dev-server, 可以提供獨立的standalone server.

      • 另一種則是使用webpack提供給express整合的middleware: webpack-dev-middleware及webpack-hot-middleware, 本段所記錄的是使用這種方式.

  • 2.Install packages

    • 需要的套件有webpack, webpack-dev-middleware, webpack-hot-middleware, react-hot-loader, react, babel-loader:

      • 1.react, babel-loader便不多作解釋

      • 2.webpack-dev-middleware, webpack-hot-middleware:讓我們用 express 客製一個有熱替換功能的 webpack 開發伺服器

      • 3.react-hot-loader:可以在不改變 React 元件的 state 下,將更改過程式碼的元件直接更新到畫面上

  • 3.Webpack.config.js

    • 要修改的地方有五處: cache, entry, output, plugins, module

      • 1.cache: enable cache

      • 2.entry: 加入'webpack-hot-middleware/client', 'webpack/hot/dev-server

      • 3.output: 加入publicPath

      • 4.plugins: 修改如下:

      • 5.module:

  • 4.index.dev.js

    • Create一個index.dev.js: 使用webpack-dev-middleware及webpack-hot-middleware,以及導入webpack.config.js

  • 5.app.js

    • 目的是分為develope版本及production版本, 當環境變數不是production時,就會切到index.dev.js

  • 6.package.json

    • 在package.json的scripts中放入dev, production兩個script

      • production: 將環境變數改為production, 並執行node.js

      • dev: 如果mainbundle.js存在則刪除, 並執行node.js

    • 執行dev: npm run dev

    • 執行production:

  • 7.index.html

    • 記得埋入script source

Last updated