webpack

webpack

ๅ‰่จ€

webpackไฝœไธบๅฝ“ไธ‹ๅ‰็ซฏๆœ€็ซ็š„ๆจกๅ—ๅŒ–ๆ‰“ๅŒ…ๅทฅๅ…ท๏ผŒๅ…ทๆœ‰ๅผบๅคงไธฐๅฏŒ็š„ๅŠŸ่ƒฝ๏ผŒๅฎƒ่ƒฝๅคŸๅˆ†ๆž้กน็›ฎ็ป“ๆž„๏ผŒๅค„็†ๆจกๅ—ๅŒ–ไพ่ต–๏ผŒ่ฝฌๆขๆˆไธบๆต่งˆๅ™จๅฏ่ฟ่กŒ็š„ไปฃ็ ็ญ‰ใ€‚ๆฆ‚ๆ‹ฌๅฆ‚ไธ‹๏ผš

  • ไปฃ็ ่ฝฌๆข: TypeScript ็ผ–่ฏ‘ๆˆ JavaScriptใ€SCSS,LESS ็ผ–่ฏ‘ๆˆ CSS.

  • ๆ–‡ไปถไผ˜ๅŒ–๏ผšๅŽ‹็ผฉ JavaScriptใ€CSSใ€HTML ไปฃ็ ๏ผŒๅŽ‹็ผฉๅˆๅนถๅ›พ็‰‡ใ€‚

  • ไปฃ็ ๅˆ†ๅ‰ฒ๏ผšๆๅ–ๅคšไธช้กต้ข็š„ๅ…ฌๅ…ฑไปฃ็ ใ€ๆๅ–้ฆ–ๅฑไธ้œ€่ฆๆ‰ง่กŒ้ƒจๅˆ†็š„ไปฃ็ ่ฎฉๅ…ถๅผ‚ๆญฅๅŠ ่ฝฝใ€‚

  • ๆจกๅ—ๅˆๅนถ๏ผšๅœจ้‡‡็”จๆจกๅ—ๅŒ–็š„้กน็›ฎ้‡Œไผšๆœ‰ๅพˆๅคšไธชๆจกๅ—ๅ’Œๆ–‡ไปถ๏ผŒ้œ€่ฆๆž„ๅปบๅŠŸ่ƒฝๆŠŠๆจกๅ—ๅˆ†็ฑปๅˆๅนถๆˆไธ€ไธชๆ–‡ไปถใ€‚

  • ่‡ชๅŠจๅˆทๆ–ฐ๏ผš็›‘ๅฌๆœฌๅœฐๆบไปฃ็ ็š„ๅ˜ๅŒ–๏ผŒ่‡ชๅŠจ้‡ๆ–ฐๆž„ๅปบใ€ๅˆทๆ–ฐๆต่งˆๅ™จใ€‚

  • ๆž„ๅปบๆŠŠไธ€็ณปๅˆ—ๅ‰็ซฏไปฃ็ ่‡ชๅŠจๅŒ–ๅŽปๅค„็†ๅคๆ‚็š„ๆต็จ‹๏ผŒ่งฃๆ”พ็”ŸไบงๅŠ›ใ€‚

ๅผ•ๅ…ฅwebpack

ๅ…จๅฑ€ๅผ•ๅ…ฅwebpack

  $ npm install -g webpack

webpack4.xๅŽ้œ€่ฆๅผ•ๅ…ฅwebpack-cli

  $ npm install -g webpack-cli

webpackๅธธ็”จๅ‘ฝไปค

  • webpack โ€“ ๅผ€ๅ‘็Žฏๅขƒๆ‰“ๅŒ…

  • webpack -p โ€“ ็”Ÿไบง็Žฏๅขƒๆ‰“ๅŒ…

  • webpack --watch โ€“ ็›‘ๅฌๅ˜ๅŠจ่‡ชๅŠจๆ‰“ๅŒ…

  • webpack -d โ€“ ็”Ÿๆˆmapๆ˜ ๅฐ„

  • webpack --colors โ€“ ๆ‰“ๅŒ…่ฟ‡็จ‹้ขœ่‰ฒ่พ“ๅ‡บ

webpack ๅ…ฅ้—จ: webpack-demos ๅญฆไน ็ฌ”่ฎฐ

้€š่ฟ‡ๅฏนwebpack-demosๅ†…15ไธชdemoๆกˆไพ‹็š„ๅˆ†ๆž๏ผŒๆฅๅฏนwebpack่ฟ›่กŒๅ…ฅ้—จ็บง็š„ๅญฆไน ใ€‚

demo1 Enrty file

ๅ…ˆ็œ‹ๆ–‡ไปถ็›ฎๅฝ•

demo1

ๅ…ถไธญwebpack.config.jsไธบwebpack้…็ฝฎๆ–‡ไปถ

  // webpack.config.js
  module.exports = {
    entry: './main.js',
    output: {
      filename: 'bundle.js'
    }
  };

ๅฏไปฅ่ฏดๆ˜ฏๆœ€ๅŸบ็ก€็š„ไธ€ไธชไพ‹ๅญ๏ผŒentryไธบwebpackๅ…ฅๅฃๆ‰€ๅœจไฝ็ฝฎ

  // main.js
  document.write('<h1>Hello World</h1>');

่€Œoutputๅฏนๅบ”็š„bundle.jsๅฐฑๆ˜ฏwebpackๆ นๆฎmain.jsๆจกๅ—ๅŒ–ๆ‰“ๅŒ…็”Ÿๆˆ็š„ไธ€ไธชjsๆ–‡ไปถ๏ผŒๅนถไผš่ขซhtmlๅผ•ๅ…ฅ๏ผŒไปŽๆ•ˆๆžœไธŠๆฅ่ฏดไธŽ็”จscriptๆ ‡็ญพๅผ•ๅ…ฅmain.jsไปฃ็ ็›ธๅŒใ€‚

ๆ€ป็ป“๏ผšoutputๅ’Œentryไธบwebpack็š„ๅ…ฅๅฃไธŽๅ‡บๅฃๆ–‡ไปถ๏ผŒoutput็š„้ป˜่ฎค่ทฏๅพ„ไธบ./dist

demo2 Multiple entry files

demo2

ไปŽๅๅญ—ไนŸๅฏไปฅ็œ‹ๅ‡บ๏ผŒdemo2ๅฐฑๆ˜ฏdemo1็š„ไธ€ไธชๅคšๆ–‡ไปถ็‰ˆๆœฌ๏ผŒๆฅ็œ‹ไธ€ไธ‹้…็ฝฎๆ–‡ไปถ

  // webpack.config.js
  module.exports = {
    entry: {
      bundle1: './main1.js',
      bundle2: './main2.js'
    },
    output: {
      filename: '[name].js'
    }
  };

ๅ…ฅๅฃๆ–‡ไปถๆœ‰main1.jsๅ’Œmain2.jsไธคไธช๏ผŒ่€Œๅ‡บๅฃๆ–‡ไปถไปŽๆ–‡ไปถ็›ฎๅฝ•ไธญๅฏ็Ÿฅๆœ‰bundle1.jsๅ’Œbundle2.jsไธคไธชๆ–‡ไปถ๏ผŒๅฏ่งๅ‡บๅฃๆ–‡ไปถ็š„[name]ๅณไธบไธ€ไธชๅ‚ๆ•ฐ๏ผŒ้ป˜่ฎคๆƒ…ๅ†ตไธ‹nameไธบbundleใ€‚

ๆ€ป็ป“๏ผš ๅ‡บๅ…ฅๅฃๆ–‡ไปถๅฏไปฅๆœ‰ๅคšไธช๏ผŒๅ‡บๅฃๆ–‡ไปถ็š„ๅ‘ฝๅๅฏไปฅๆ นๆฎๅ‚ๆ•ฐๅ†ณๅฎšใ€‚

demo3 Babel-loader

demo3

็›ธๆฏ”ไบŽdemo1๏ผŒdemo3็š„main.js่ขซๆ›ฟๆขไธบไบ†main.jsxๆ–‡ไปถ๏ผŒไผ—ๆ‰€ๅ‘จ็Ÿฅ๏ผŒjsxๆ˜ฏReactๆœ€ๅŸบๆœฌ็š„ๆ–‡ไปถๆ ผๅผ๏ผŒ่€Œๅ…‰ๆœ‰ๅ‡บๅ…ฅๅฃ็š„webpackๆ— ๆณ•่งฃๆžjavascriptไปฅๅค–ๆ ผๅผ็š„ๆ–‡ไปถใ€‚้‚ฃไนˆๆฅ็œ‹ไธ€ไธ‹้…็ฝฎใ€‚

  // webpack.config.js
  module.exports = {
    entry: './main.jsx',
    output: {
      filename: 'bundle.js'
    },
    module: {
      rules: [
        {
          test: /\.jsx?$/,
          exclude: /node_modules/,
          use: {
            loader: 'babel-loader',
            options: {
              presets: ['es2015', 'react']
            }
          }
        }
      ]
    }
  };

webapck้€š่ฟ‡babel-loaderๅฐ†jsx็ผ–่ฏ‘ไธบjsๆ–‡ไปถ๏ผŒ่พ“ๅ‡บ่‡ณbundle.jsใ€‚

ๆ€ป็ป“๏ผš loaderๆœ‰ไธคไธชๅ…ณ้”ฎ็‚น๏ผŒไธ€ไธชๆ˜ฏtest๏ผŒ้€š่ฟ‡ๆญฃๅˆ™่กจ่พพๅผๅŒน้…ๆŸไธ€ๆ ผๅผ็š„ๆ–‡ไปถใ€‚ๅฆไธ€ไธชๆ˜ฏloader๏ผŒ่กจๆ˜Ž็”จไฝ•็งloaderๆฅๅฏน่ฏฅๆ–‡ไปถๆ ผๅผ่ฟ›่กŒๅค„็†๏ผŒๅฏไฝฟๅ…ถๆˆไธบไธ€ไธชjsๆ ผๅผ็š„ๆ–‡ไปถใ€‚

demo4 css-loader

ไปŽๆ–‡ไปถๅ†…ๅฎนไธŽๅๅญ—ไธŠๆฅ็œ‹๏ผŒๅฐฑๆ˜ฏ้€š่ฟ‡webpack็š„css-loaderๅฏนcssๆ–‡ไปถ่ฟ›่กŒ่งฃๆžใ€‚

  module.exports = {
    entry: './main.js',
    output: {
      filename: 'bundle.js'
    },
    module: {
      rules:[
        {
          test: /\.css$/,
          use: [ 'style-loader', 'css-loader' ]
        },
      ]
    }
  };

ๆฅ็œ‹้…็ฝฎๆ–‡ไปถ๏ผŒ้™คไบ†css-loaderๅค–๏ผŒๅ€ผๅพ—ๆณจๆ„็š„่ฟ˜ๆœ‰ไธ€ไธชstyle-loader๏ผŒๅฎƒๅœจๆญคๅค„็š„ไฝœ็”จๅฐฑๆ˜ฏไธบhtmlๆณจๅ…ฅstyleๆ ‡็ญพ๏ผŒไปฅๆญคๆฅไฝฟcss็”Ÿๆ•ˆใ€‚

demo5 Image loader

webpackๅฏนpngๆˆ–jpgๆ ผๅผๅ›พ็‰‡่ฟ›่กŒๅค„็†๏ผŒๅฝขๅผไธŽๅ‰ไธคไธช็›ธๅŒใ€‚

  // webpack.config.js
  module.exports = {
    entry: './main.js',
    output: {
      filename: 'bundle.js'
    },
    module: {
      rules:[
        {
          test: /\.(png|jpg)$/,
          use: [
            {
              loader: 'url-loader',
              options: {
                limit: 8192
              }
            }
          ]
        }
      ]
    }
  };

ไปŽ้…็ฝฎๆ–‡ไปถ็š„ๅ†…ๅฎนๆฅ็œ‹๏ผŒ้€š่ฟ‡url-loaderไธบhtmlๆณจๅ…ฅไธ€ไธชimg็š„ๆ ‡็ญพ๏ผŒๆฅไฝฟๅ›พ็‰‡ๆญฃ็กฎๆ˜พ็คบใ€‚

demo6 CSS Module

demo6

ๅ…ˆๆฅ็œ‹demo6็š„็›ฎๅฝ•๏ผŒๆ นๆฎๅ‰ๅ‡ ไธชๆ ทไพ‹๏ผŒๆˆ‘ไปฌๅพˆๆ˜Žๆ˜พๅฐฑ่ƒฝ็Ÿฅ้“webpack้œ€่ฆ็”จcss-loaderๅ’Œstyle-loaderๆฅๆ‰“ๅŒ…cssๆ–‡ไปถ๏ผŒ็”จbabel-loaderๆฅๆ‰“ๅŒ…jsxๆ–‡ไปถใ€‚

้‚ฃไนˆwebpack้…็ฝฎๅŸบๆœฌๅ†…ๅฎน็กฎๅฎšไน‹ๅŽๅ†ๆฅ็œ‹ไปฃ็ ๅ†…ๅฎน๏ผŒ

/* app.css */
.h1 {
  color:red;
}

:global(.h2) {
  color: blue;
}
/* main.jsx */
var React = require('react');
var ReactDOM = require('react-dom');
var style = require('./app.css');

ReactDOM.render(
  <div>
    <h1 className={style.h1}>Hello World</h1>
    <h2 className="h2">Hello Webpack</h2>
  </div>,
  document.getElementById('example')
);

ๆฏ”่พƒ็‰นๆฎŠ็š„็‚นๅœจไบŽcssๆœ‰ไธ€ไธชglobal๏ผŒ่€Œjsxๆ–‡ไปถๅ†…ๅผ•ๅ…ฅไบ†cssๆ–‡ไปถ๏ผŒๅนถๅฐ†style.h1่ต‹ๅ€ผ็ป™ไบ†ไธ€ไธชๅ…ƒ็ด ๏ผŒๅ†ๆฅ็œ‹ไธ€ไธ‹่ฟ่กŒๆ•ˆๆžœใ€‚

demo6ๆ•ˆๆžœ
  • htmlๆ–‡ไปถไธญ็ฑปๅไธบh1็š„ๅ…ƒ็ด ๅนถๆฒกๆœ‰็”Ÿๆ•ˆ.h1็š„ๆ ทๅผ๏ผŒjsx็š„renderไธญ็ฑปๅไธบstyle.h1็š„ๅ…ƒ็ด ๅด็”Ÿๆ•ˆไบ†.h1็š„ๆ ทๅผใ€‚ไธ”็ฑปๅไธๅ†ไธบh1๏ผŒwebpackๅฐ†็ฑปๅ็ผ–่ฏ‘ไธบไธ€ไธฒๅ“ˆๅธŒๅญ—็ฌฆไธฒ๏ผŒ่ฏฅๆ ทไพ‹ไธญๅฐฑๅชๅœจjsxๆ–‡ไปถๅ†…ๅฑ€้ƒจ่ขซๅผ•ๅ…ฅๅนถ็”Ÿๆ•ˆใ€‚

  • .h2็š„ๆ ทๅผ็”ฑไบŽๅขžๅŠ ไบ†global็”ณๆ˜Ž๏ผŒๅฐฑๆœช่ขซwebpack่ฝฌไธบๅฑ€้ƒจๆ ทๅผ๏ผŒไนŸไธไผš่ขซ่ฝฌๅ“ˆๅธŒๅ€ผๅŽๅผ•ๅ…ฅ๏ผŒๆญฃๅธธ็”Ÿๆ•ˆไบŽๆ‰€ๆœ‰ๅฏนๅบ”ๅ…ƒ็ด ใ€‚

ๅฏไปฅ่ฏ•็€ๆ‰“ๅฐไธ€ไธ‹jsxไธญๅผ•ๅ…ฅ็š„style็š„ๅ†…ๅฎน๏ผŒๅฏไปฅๅ‘็Žฐๅชๆœ‰h1่ขซ่ฝฌ่ฏ‘ใ€‚

{
  h1: "_1yZB3Q5Xe45RPofl-yJAo3"
}

ๆœ€ๅŽๅ†ๆฅ็œ‹ไธ€ไธ‹้…็ฝฎๆ–‡ไปถ็š„็‰นๆฎŠ็‚น๏ผŒๅฏไปฅๅ‘็Žฐcss-loaderไธญๅขžๅŠ ไบ†modulesไธบtrue็š„้…็ฝฎ๏ผŒไนŸๅฐฑๆ˜ฏไฝฟcssๆจกๅ—ๅŒ–็”Ÿๆ•ˆ๏ผŒๅฐ†ๆ ทๅผๆจกๅ—ๅŒ–ๆ‰“ๅŒ…๏ผŒๅฏไปฅๆœ‰ๆ•ˆๆŽงๅˆถ้กน็›ฎๆ ทๅผ็”Ÿๆ•ˆ็š„่Œƒๅ›ด๏ผŒ้˜ฒๆญขไธ€ไบ›ๅ…จๅฑ€็š„ๆ ทๅผๆฑกๆŸ“ใ€‚

// webpack.config.js
module.exports = {
  //...
  module: {
    rules: [
      //...
      {
        test: /\.css$/,
        use: [
          // ...
          {
             loader: 'css-loader',
             options: {
               modules: true
             }
          }
        ]
      }
    ]
  }
}

demo7 UglifyJs Plugin

็›ดๆŽฅๆฅ็œ‹webpack้…็ฝฎๆ–‡ไปถ

// webpack.config.js
var webpack = require('webpack');
var UglifyJsPlugin = require('uglifyjs-webpack-plugin');

module.exports = {
  entry: './main.js',
  output: {
    filename: 'bundle.js'
  },
  plugins: [
    new UglifyJsPlugin()
  ]
};

็›ธ่พƒไบŽไธŠ้ข็š„ๆ ทไพ‹๏ผŒๅขžๅŠ ไบ†ไธ€ไธชๅไธบplugins็š„้…็ฝฎ๏ผŒplugins(ๆ’ไปถ)ๅฏไปฅ่ฏดๆ˜ฏwebpackๆœ€้‡่ฆ็š„้…็ฝฎไน‹ไธ€๏ผŒๆ’ไปถ็š„่‡ช็”ฑๅบฆๅพˆ้ซ˜๏ผŒไนŸๅฏไปฅ่‡ชๅทฑ็ผ–ๅ†™ใ€‚ๆœฌๆ ทไพ‹ไธญๆ‰€ไฝฟ็”จ็š„ๆ˜ฏๅฎ˜ๆ–นๆไพ›็š„ไธ€ไธช็”จไบŽๅŽ‹็ผฉjsไปฃ็ ็š„ๆ’ไปถใ€‚

่ฟ่กŒไปฃ็ ๅŽๆˆ‘ไปฌๅฏไปฅๅ‘็Žฐ๏ผŒmain.js็š„ไปฃ็ ไผš่ขซๅŽ‹็ผฉ๏ผŒ่ฏฅไพ‹ๅญไธญไธบๆœ€ๅŸบๆœฌ็š„ๅ‚ๆ•ฐๅ้•ฟๅบฆ็š„ๅŽ‹็ผฉ

// main.js ๅŽ‹็ผฉๅ‰
var longVariableName = 'Hello';
longVariableName += ' World';
document.write('<h1>' + longVariableName + '</h1>');

// main.js ๅŽ‹็ผฉๅŽ
var r = "Hello";
r += " World",
document.write("<h1>" + r + "</h1>")

demo8 HTML Webpack Plugin and Open Browser Webpack Plugin

ๅŒๆ ทๆ˜ฏ่ฎฒๆ’ไปถ้…็ฝฎ็š„ๆ ทไพ‹๏ผŒ็›ดๆŽฅๆฅ็œ‹้…็ฝฎๆ–‡ไปถใ€‚

var HtmlwebpackPlugin = require('html-webpack-plugin');
var OpenBrowserPlugin = require('open-browser-webpack-plugin');

module.exports = {
  entry: './main.js',
  output: {
    filename: 'bundle.js'
  },
  plugins: [
    new HtmlwebpackPlugin({
      title: 'Webpack-demos',
      filename: 'index.html'
    }),
    new OpenBrowserPlugin({
      url: 'http://localhost:8080'
    })
  ]
};

ๆ•ดไฝ“ๆฅ่ฏด่ฟ™ไธชๆ ทไพ‹้šพๅบฆไธๅคง๏ผŒๆ’ไปถ้ƒฝๆœ‰่‡ชๅทฑๆ”ฏๆŒ็š„api๏ผŒๅฏไปฅๅœจๆ’ไปถ็š„ๆ–‡ๆกฃไธญๆ‰พๅˆฐๅ„่‡ช็š„ๅซไน‰ใ€‚

  • HtmlwebpackPlugin: ่‡ชๅŠจ็”Ÿๆˆindex.htmlๆ–‡ไปถ๏ผŒๆˆ–่€…่ฏด่‡ชๅŠจ็”Ÿๆˆๅ…ฅๅฃ็š„htmlๆ–‡ไปถใ€‚

  • OpenBrowserPlugin: ๆœฌๅœฐ่ฟ่กŒ้กน็›ฎไปฃ็ ๆ—ถ๏ผŒ่ƒฝๅคŸ่‡ชๅŠจๆ‰“ๅผ€ๆต่งˆๅ™จ๏ผŒไธ”่ง„ๅฎšไบ†ๆœฌๅœฐ่ฟ่กŒ็š„ๅœฐๅ€ไธŽ็ซฏๅฃใ€‚

demo9 Environment flags

webpackๅฏไปฅ็”จไบŽไผ ้€’ๅ…จๅฑ€ๅ˜้‡๏ผŒๅฆ‚ๅŒบๅˆ†ๅผ€ๅ‘็ŽฏๅขƒไธŽ็”Ÿไบง็Žฏๅขƒ๏ผŒๆฅ็œ‹webpack็š„้…็ฝฎๆ–‡ไปถ

// webpack.config.js
var webpack = require('webpack');

var devFlagPlugin = new webpack.DefinePlugin({
  __DEV__: JSON.stringify(JSON.parse(process.env.DEBUG || 'false'))
});

module.exports = {
  entry: './main.js',
  output: {
    filename: 'bundle.js'
  },
  plugins: [devFlagPlugin]
};
// package.json
// ...
"scripts": {
  "dev": "npx cross-env DEBUG=true webpack-dev-server --open",
  "build": "npx cross-env DEBUG=false webpack"
},

ไฝฟ็”จwebpack.DefinePluginไผ ้€’ๅ…จๅฑ€ๅ‚ๆ•ฐ๏ผŒๅฆ‚่ง„ๅฎšๅผ€ๅ‘็Žฏๅขƒ็š„ๆ ‡ๅฟ—๏ผŒ้‚ฃไนˆไฝฟ็”จ่ฏฅๆ’ไปถไน‹ๅŽ๏ผŒๅฐฑๅฏไปฅๅœจๅผ€ๅ‘็Žฏๅขƒไธญ็”Ÿๆ•ˆ่ฟ™ไธชๅ‚ๆ•ฐ๏ผŒๅฆ‚ไธ‹้ขไปฃ็ ไธญ๏ผŒๅชๆœ‰ๅœจๅผ€ๅ‘็Žฏๅขƒไธญๆ‰่ƒฝ็œ‹ๅˆฐๆ—ถ้—ดใ€‚

// main.js
document.write('<h1>Hello World</h1>');

if (__DEV__) {
  document.write(new Date());
}

demo10 Code splitting

ๅœจๅ‰็ซฏ้กต้ข่ฟ›่กŒๅŠ ่ฝฝ็š„ๆ—ถๅ€™๏ผŒๆœ‰ๆ—ถๅนถไธ้œ€่ฆไธ€ๆฌกๆ€งๆŠŠๆ‰€ๆœ‰็š„ไปฃ็ ้ƒฝๅŠ ่ฝฝๅฎŒๆˆ๏ผŒๆฏ”ๅฆ‚ไธ€ไบ›้ž้ฆ–ๆฌก่ฏพไปถ็š„ๅ…ƒ็ด ๏ผŒๅƒๅผน็ช—๏ผŒๆˆ–่€…ๆ ‡็ญพ้กต็ญ‰ใ€‚ๆŒ‰้œ€ๅŠ ่ฝฝๆ˜ฏwebpackๆไพ›็š„ไธ€ไธช้žๅธธ้‡่ฆ็š„ๅŠŸ่ƒฝ๏ผŒๅšๅฅฝไปฃ็ ๅˆ†ๅ‰ฒ๏ผŒๅฏไปฅๆœ‰ๆ•ˆๆๅ‡ๅ‰็ซฏ้กต้ข็š„ๅŠ ่ฝฝๆ•ˆ็އไธŽไผ˜ๅŒ–็”จๆˆทไฝ“้ชŒใ€‚

ๆฅ็œ‹ไธ€ไธ‹demo10็š„ๆ–‡ไปถ็›ฎๅฝ•

demo10
// webapck.config.js
module.exports = {
  entry: './main.js',
  output: {
    filename: 'bundle.js'
  }
};

ๅฏไปฅๅ‘็Žฐๆœ‰ไธคไธชjsๅ…ฅๅฃๆ–‡ไปถ๏ผŒไฝ†ๅœจwebpack็š„้…็ฝฎไธญ๏ผŒๅนถๆฒกๆœ‰ๅƒdemo2ไธ€ๆ ท่ฎพ็ซ‹ไบ†ไธคไธชๅ…ฅๅฃ

// main.js
require.ensure(['./a'], function(require) {
  var content = require('./a');
  document.open();
  document.write('<h1>' + content + '</h1>');
  document.close();
});

้‚ฃไนˆๅœจ็œ‹main.js็š„ไปฃ็ ๏ผŒไฝฟ็”จrequire.ensureๅผ•ๅ…ฅไบ†a.js๏ผŒๆ‰€ไปฅๆฒกๆœ‰ไธคไธชๅ…ฅๅฃๆ˜ฏๆญฃๅธธ็š„ใ€‚ไฝ†ๆ‰“ๅŒ…็”Ÿๆˆ็š„ไปฃ็ ๅดๆœ‰bundle.jsๅ’Œ0.bundle.jsไธคไปฝใ€‚่ฟ™ๅฐฑๆ˜ฏwebpack่ฟ›่กŒไบ†ไปฃ็ ๅˆ†ๅ‰ฒๅค„็†ใ€‚้€š่ฟ‡่ฟ™็งๆ–นๆณ•ๅผ•ๅ…ฅ็š„ไปฃ็ ๏ผŒๅœจๆ‰“ๅŒ…ๅŽไผš่ขซๅˆ†ๅ‰ฒ๏ผŒๅนถไธ”ๅœจ้œ€่ฆๆ—ถ่ฟ›่กŒๅŠ ่ฝฝใ€‚

demo10ๆ•ˆๆžœๅ›พ

ๅฝ“็„ถๅœจ่ฟ™ไธชๆ ทไพ‹ไธญๅนถไธ่ƒฝ็œ‹ๅˆฐๆ˜Žๆ˜พ็š„ๆŒ‰้œ€ๅŠ ่ฝฝๆ•ˆๆžœ๏ผŒๅœจ็•Œ้ขๆ‰“ๅผ€ๆ—ถ่ฟ™ไธคไปฝๆ–‡ไปถ้ƒฝๆœ‰ๆ‰“ๅŒ…้œ€ๆฑ‚๏ผŒๆ‰€ไปฅ้ƒฝ่ฟ›่กŒไบ†ๅŠ ่ฝฝใ€‚

ๅœจvueไธญ๏ผŒ้€š่ฟ‡importไนŸๅฏไปฅๅฎž็Žฐไปฃ็ ๅˆ†ๅ‰ฒไธŽๆŒ‰้œ€ๅŠ ่ฝฝ๏ผŒๅœจrouterไธญๅผ•ๅ…ฅๅฏไปฅๅฎž็Žฐ้กต้ข็š„ๆŒ‰้œ€ๅŠ ่ฝฝ๏ผŒ่€Œๅœจvueๆ–‡ไปถ็š„็ป„ไปถ(components)ไธญๅผ•ๅ…ฅๅˆ™ๅฏไปฅๅฎž็Žฐ็ป„ไปถ็š„ๆŒ‰้œ€ๅŠ ่ฝฝ๏ผŒๅผ•ๅ…ฅๆ–นๅผๅฆ‚ไธ‹ใ€‚

const index = () => import(/* webpackChunkName: "index" */ './index.vue');

demo11 code splitting with bundle-loader

ๆ‰€่กจ่ฟฐ็š„ๅŠŸ่ƒฝไธŽdemo10็›ธๅŒ๏ผŒๅ”ฏไธ€็š„ๅŒบๅˆซๅฐฑๅœจไบŽmain.jsไธญๅฏนa.js็š„ๅผ•ๅ…ฅๆ–นๅผ

var load = require('bundle-loader!./a.js');

load(function(file) {
  document.open();
  document.write('<h1>' + file + '</h1>');
  document.close();
});

ไปฅ่ฏฅ็งๆ–นๅผๅผ•ๅ…ฅๅŽ๏ผŒๆฅ่ฟ›่กŒ็›ธๅบ”chunk็š„ๅŠ ่ฝฝ๏ผŒ่ฏฅๆ–นๆณ•ไผš่ฟ”ๅ›žไธ€ไธชfunction๏ผŒไธ”ๅ…ฅๅ‚ไธบไธ€ไธชๅ›ž่ฐƒๆ–นๆณ•

// ๅœจrequire bundleๆ—ถ๏ผŒๆต่งˆๅ™จไผšๅŠ ่ฝฝๅฎƒ
var waitForChunk = require("bundle!./file.js");

// ็ญ‰ๅพ…ๅŠ ่ฝฝ๏ผŒๅœจๅ›ž่ฐƒไธญไฝฟ็”จ
waitForChunk(function(file) {
  // ่ฟ™้‡Œๅฏไปฅไฝฟ็”จfile๏ผŒๅฐฑๅƒๆ˜ฏ็”จไธ‹้ข็š„ไปฃ็ require่ฟ›ๆฅไธ€ๆ ท
  // var file = require("./file.js");
});

ไฝ†ๆ˜ฏ่ฟ™ๆ ทๅผ•ๅ…ฅๅ…ถๅฎžๅนถ้žๆ˜ฏๆŒ‰้œ€ๅŠ ่ฝฝ๏ผŒๅฆ‚ๆžœ้œ€่ฆๅฎž็ŽฐๆŒ‰้œ€ๅŠ ่ฝฝ๏ผŒ้œ€่ฆไปฅไปฅไธ‹ๆ–นๅผๅผ•ๅ…ฅ

var load = require("bundle?lazy!./file.js");

// ๅชๆœ‰ๅœจ่ฐƒ็”จload็š„ๆ—ถๅ€™ๆ‰ไผš็œŸๆญฃๅŠ ่ฝฝ
load(function(file) {

});

demo12 Common chunk

ๅ…ˆๆฅ็œ‹ๆ–‡ไปถ็ป“ๆž„ไธŽ้ƒจๅˆ†ๆ–‡ไปถๅ†…ๅฎน

demo12
// main1.jsx
var React = require('react');
var ReactDOM = require('react-dom');
ReactDOM.render(
  <h1>Hello World</h1>,
  document.getElementById('a')
);

main2.jsxไธŽ1็ฑปไผผ๏ผŒๆ— ้žๅฐฑๆ˜ฏ้€‰ไธญไบ†ๅฆไธ€ไธชๅ…ƒ็ด ๏ผŒๆ›ดๆ”นไบ†h1ๆ ‡็ญพ็š„ๅ†…ๅฎนใ€‚

ๅฏนไบŽmain1ไธŽmain2่ฟ™ไธคไธชๆจกๅ—็š„ไปฃ็ ๏ผŒ้ƒฝๅŒๆ—ถๅผ•ๅ…ฅไบ†reactไธŽreact-domไธคไธชๆจกๅ—๏ผŒๅฏไปฅ่ฏดๆ˜ฏไธคไธชๆ–‡ไปถๅ…ฌๅ…ฑๆจกๅ—๏ผŒไฝ†ๅœจwebpackๆ‰“ๅŒ…็š„ๆ—ถๅ€™๏ผŒไผšๅฐ†ๅ…ฌๅ…ฑๆจกๅ—ๅˆ†ๅˆซๆ‰“ๅŒ…่ฟ›ไธคไธชbundle้‡Œใ€‚

demo12้žcommon

็”ฑไบŽๅ…ฌๅ…ฑ้ƒจๅˆ†็š„้‡ๅคๅญ˜ๅœจ๏ผŒๆ‰€ไปฅๅฏนไบŽๅŠ ่ฝฝๆฅ่ฏดๆ˜ฏไธ€็งๅพˆๅคง็š„ๆตช่ดน๏ผŒ่ฟ™ๅฐฑๆ˜ฏ่ฟ™ไธชdemoๆ‰€่ฆไป‹็ป็š„CommonsChunkPluginๆ’ไปถๆ‰€่งฃๅ†ณ็š„้—ฎ้ข˜ใ€‚

// webpack.config.js
var webpack = require('webpack');
module.exports = {
  // ...
  plugins: [
    new webpack.optimize.CommonsChunkPlugin({
      name: "commons",
      // (the commons chunk name)

      filename: "commons.js",
      // (the filename of the commons chunk)
    })
  ]
}

ๅœจwebpack้…็ฝฎไธญๅผ•ๅ…ฅ่ฏฅ็ป„ไปถ๏ผŒๆฅๆๅ‡บๅ…ฌๅ…ฑๆจกๅ—็š„ไปฃ็ ๅฝขๆˆไธ€ไธชๆ–ฐ็š„chunk๏ผŒๆฅๅ‡ๅฐ‘้‡ๅค็š„ไปฃ็ ๆจกๅ—ๅๅคๅŠ ่ฝฝใ€‚ๅผ•ๅ…ฅๅŽ๏ผŒๅฏไปฅ็œ‹ๅˆฐbundle1ๅ’Œbundle2ไปฃ็ ้‡ๆ˜พ่‘—ๅ‡ๅฐ‘๏ผŒreactไธŽreact-domๆจกๅ—้ƒฝๅœจcommon.jsๅ†…่ขซๅผ•ๅ…ฅใ€‚

demo12common

demo13 Vendor chunk

ๅปถ็ปญdemo12๏ผŒๅฆ‚ๆžœๅœจๆš‚ๆœชๆœ‰ๅ…ฌๅ…ฑไปฃ็ ๆจกๅ—็š„ๆƒ…ๅ†ตไธ‹๏ผŒๆƒณๅฐ†ไธ€ไบ›ๆฝœๅœจ็š„ๅ…ฌๅ…ฑไปฃ็ ๆๅ‡บ๏ผŒๅˆ™ๅฐฑๅฏไปฅๅœจwebpackๅ…ฅๅฃ(entry)ไธญๅŠ ๅ…ฅvendor๏ผŒไธ€่ˆฌ่ฟ™ไบ›ๅ…ฌๅ…ฑไปฃ็ ไธบ็ฌฌไธ‰ๆ–นๅบ“๏ผŒๅฆ‚demo12็š„react๏ผŒไปฅๅŠๆœฌไพ‹ไธญ็š„jqueryใ€‚

ๆฅ็œ‹webpack้…็ฝฎ

var webpack = require('webpack');

module.exports = {
  entry: {
    app: './main.js',
    vendor: ['jquery'],
  },
  output: {
    filename: 'bundle.js'
  },
  plugins: [
    new webpack.optimize.CommonsChunkPlugin({
      name: 'vendor',
      filename: 'vendor.js'
    })
  ]
};

ๅœจๅ…ฅๅฃๅค„ๅขžๅŠ ไบ†ไธ€ไธชvendor๏ผŒๅนถๅ†™ๆ˜Žjquery๏ผŒ้…ๅˆCommonChunkPluginๆ„ไธบๆ‰“ๅŒ…ๅŽ็š„vendor.jsๅณไธบjquery็š„ไปฃ็ ๆจกๅ—ใ€‚

ๅœจwebpack-demos็š„readmeไธญ๏ผŒ่ฟ˜ๅฏไปฅ็œ‹ๅˆฐๅฏนๆœฌไพ‹็š„ไธ€ไบ›ๅœจไปฃ็ ไธญๆฒกๆœ‰็š„่กฅๅ……ใ€‚ๆฏ”ๅฆ‚ๅฏนไบŽๆœฌไพ‹ไธญ็š„jquery๏ผŒๆˆ‘ไปฌ้œ€่ฆๅœจๅ•ไธชjsๅ†…่ฟ›่กŒๅผ•ๅ…ฅใ€‚

// main.js
var $ = require('jquery');
$('h1').text('Hello World');

ไฝฟ็”จProvidePluginๆ’ไปถ๏ผŒๅณๅฏๅ…จๅฑ€ๆŒ‚่ฝฝ่ฟ™ไบ›็ฌฌไธ‰ๆ–นๅบ“๏ผŒไธๅฟ…ๅ†ๅœจๅ•ไธชๆ–‡ไปถๅ†…ๅˆ†ๅˆซ่ฟ›่กŒๅผ•ๅ…ฅใ€‚

// webpack.config.js
var webpack = require('webpack');
module.exports = {
  // ...
  plugins: [
    new webpack.ProvidePlugin({
      $: 'jquery',
      jQuery: 'jquery'
    })
  ]
};

demo14 Exposing global variables

่ฏดๅฎŒๆจกๅ—็š„ๅ…จๅฑ€ๆŒ‚่ฝฝ๏ผŒๅ†ๆฅ่ฏดไธ€่ฏดwebpackๅฏนๅ…จๅฑ€ๅ˜้‡็š„ๆŒ‚่ฝฝ๏ผŒ็›ธๆฏ”ๆจกๅ—็š„ๆŒ‚่ฝฝ๏ผŒๅฐฑ็ฎ€ๅ•ๅพˆๅคšไบ†๏ผŒwebpackๆไพ›็š„externalๅฑžๆ€งๅฏไปฅ็›ดๆŽฅ็”จไบŽๅ…จๅฑ€ๅ˜้‡็š„ๆŒ‚่ฝฝใ€‚

module.exports = {
  // ...
  externals: {
    // require('data') is external and available
    //  on the global var data
    'data': 'data'
  }
};
// data.js
var data = 'Hello World';

demo15 React Router

ๆœฌไพ‹ไธบไธ€ไธชwebpack + React-router็š„็ฎ€ๅ•demo๏ผŒๆ— ่ฟ‡ๅคšๅฏไป‹็ป็š„ๅ†…ๅฎน๏ผŒๅปบ่ฎฎ็›ดๆŽฅ็œ‹ไปฃ็ ใ€‚

webpack-demosๅญฆไน ๆ€ป็ป“

15ไธชdemoๆไพ›ไบ†webpack้‡่ฆๅฑžๆ€ง็š„ๅŠŸ่ƒฝ๏ผŒไป‹็ปไบ†ๅธธ็”จไธ”้‡่ฆ็š„webpackๆ’ไปถ๏ผŒไปฅๅŠcss๏ผŒimage๏ผŒjsx็ญ‰ๆ ผๅผๆ–‡ไปถ็š„ๆ‰“ๅŒ…ๆ–นๅผใ€‚ๅฏนไบŽๅˆๅญฆwebpack็š„ไบบๆฅ่ฏดๅฏไปฅ่ฏดๆ˜ฏ็›ธๅฝ“ๅ‹ๅฅฝไบ†ใ€‚

Tree-shaking

ไป€ไนˆๆ˜ฏTree-shaking

Tree-shakingๅœจwebpackไธญๆ˜ฏไธ€็งๅŠŸ่ƒฝ็š„ๆœฏ่ฏญ๏ผŒๆŒ‡็”จไบŽๅ‰”้™คJavascriptไธญๆœช่ขซๅผ•็”จ็š„ไปฃ็ (dead code)ใ€‚ไปŽๅๅญ—ไธŠๆฅ็œ‹ๅฏไปฅ่ฏดๅๅˆ†ๅฝข่ฑกไบ†๏ผŒ็›ธๅฝ“ไบŽ่ฆไธ€ๆฃตๆ ‘๏ผŒๆŠŠๆ ‘ไธŠ็š„ๆžฏๅถ๏ผˆๆœช่ขซๅผ•็”จ็š„ไปฃ็ ๏ผ‰ๆ‘‡ไธ‹ๆฅ๏ผŒ้‚ฃไนˆ่ขซๆ‘‡ๅ‰ฉไธ‹็š„ๆ ‘ๅถๅฟ…็„ถๆ˜ฏๅฅๅบทๆœ‰็”จ็š„ใ€‚Tree-shakingไนŸๆ˜ฏwebpackไผ˜ๅŒ–jsไปฃ็ ่ฟ™ไธ€ๅŠŸ่ƒฝ็š„้‡่ฆ้ƒจๅˆ†ไน‹ไธ€ใ€‚

้ฆ–ๅ…ˆ่ฆๆ˜Ž็กฎไธ€็‚น๏ผŒไฝฟ็”จTree-shaking็š„ๅ‰ๆๆ˜ฏไฝฟ็”จES6ๆจกๅ—็ณป็ปŸ๏ผŒๅฆ‚importๅ’Œexport๏ผŒ่€Œไธๆ”ฏๆŒCommonJSใ€‚

่ฟ™ๅฐฑไธๅพ—ไธ็ฎ€ๅ•ๆไธ€ๆCommonJSๅ’ŒES6ๆจกๅ—็š„ๅŒบๅˆซไบ†

  • CommonJS๏ผš ่ฟ่กŒๆ—ถ่ฟ›่กŒๅŠจๆ€ๅŠ ่ฝฝ๏ผŒ้€š่ฟ‡ไธŠๆ–‡็š„demo10ๅ’Œdemo11ไนŸๅฏไปฅ็œ‹ๅˆฐ๏ผŒๅ…ถๅฎž็ŽฐๆŒ‰้œ€ๅŠ ่ฝฝ็š„ไพฟๅˆฉๆ€งใ€‚ๅฆๅค–๏ผŒ็”ฑไบŽCommonJSๆ‰€ๅฏผๅ‡บ็š„ๅ†…ๅฎน้ƒฝๅฏไปฅ่ง†ไฝœไธ€ไธชๅฏน่ฑก๏ผŒๆ‰€ไปฅๅ…ถๅŠ ่ฝฝ็š„ๆ—ถๅ€™้ƒฝไผšๅŠ ่ฝฝๆ•ดไธชๆจกๅ—๏ผŒๆˆ–่€…่ฏดไผšๅฐ†ๆ‰€ๆœ‰็š„ๆŽฅๅฃ้ƒฝๅŠ ่ฝฝ่ฟ›ๆฅใ€‚ๅ…ณไบŽCommonJS๏ผŒๅฏไปฅ่ฏฆ่งNodeๆจกๅ—็ณป็ปŸ็š„ไป‹็ปใ€‚

  • ES6 Module๏ผš ES6ๆจกๅ—็š„ๅŠ ่ฝฝๅฐฑๆ›ดๅๅ‘ไบŽ้™ๆ€ไธ€ไบ›๏ผŒๅœจ็ผ–่ฏ‘็š„ๆ—ถๅ€™ๅฐฑไผš่ฟ›่กŒๅผ•ๅ…ฅ๏ผŒ่€Œ้ž่ฟ่กŒ็š„ๆ—ถๅ€™ใ€‚ไปŽๅ‘ฝๅ็š„่ง’ๅบฆๅฐฑๆ›ดๅฅฝ็†่งฃไธ€็‚น๏ผŒCommonJSไฝฟ็”จrequire่ฟ›่กŒๅผ•ๅ…ฅ๏ผŒๆœ‰ไธ€็งๅœจ้œ€่ฆ็š„ๆ—ถๅ€™ๆ‰ไผšๅŠ ่ฝฝ็š„ๅซไน‰ใ€‚่€Œimportๅˆ™ๆ›ดๅๅ‘ไบŽๅœจไธ€ๅผ€ๅง‹ๅฐฑๅ‘็ป„ไปถไธ€ๆ ท๏ผŒไธ€ๅ—ๅ—ๅฎ‰่ฃ…ๅฅฝ๏ผŒ็„ถๅŽๅ†่ฟ›่กŒ่ฟ่กŒใ€‚ๅฆๅค–๏ผŒES6ๆจกๅ—ๅฏไปฅๆœ‰ๅคšไธชexport๏ผŒๆ‰€ไปฅๅœจๅผ•ๅ…ฅ็š„ๆ—ถๅ€™ไนŸๅฏไปฅๅ•็‹ฌๅผ•ๅ…ฅๅ…ถไธญ็š„ไธ€ไธชๆˆ–ๅคšไธชๆŽฅๅฃใ€‚

ๅ€Ÿ้‰ดไบŽ่ฟ™ไธชๅŒบๅˆซ๏ผŒๆ‰€ไปฅTree-shakingไพ่ต–ES6ๆจกๅ—ๅฎž็Žฐๆˆไธบไบ†ๅฏ่ƒฝ๏ผŒๅฎƒไธไป…่ƒฝๅคŸๅฎž็ŽฐๆŒ‰้œ€ๅŠ ่ฝฝไผ˜ๅŒ–็”จๆˆทไฝ“้ชŒ๏ผŒๅŒๆ—ถไนŸ้€š่ฟ‡ไธๅŠ ่ฝฝๆ— ็”จไปฃ็ ่€Œไฝฟๅ‰็ซฏ็ณป็ปŸ็š„ๅŒ…ไฝ“ๅพ—ๅˆฐไบ†ๅ‡ๅฐใ€‚

ๅฆ‚ไฝ•ไฝฟ็”จTree-shaking

ๆฅไธพไธ€ไธชๆฏ”่พƒ็ฎ€ๅ•็š„Tree-shaking็š„ไพ‹ๅญ๏ผŒ็Žฐๅœจๆœ‰ไธ€ไธชๆจกๅ—ไปฃ็ ๅฆ‚ไธ‹๏ผš

// mathUtil.js
export function square(x) {
  alert(x * x);
}

export function cube(x) {
  alert(x * x * x);
}

ๅœจๅฆไธ€ไธชjsๆ–‡ไปถไธญ่ฟ›่กŒๅผ•ๅ…ฅ๏ผš

//main.js
import { square } from './a.js'
square(2);

็„ถๅŽ็”จwebpackๆ‰“ๅŒ…่ฟ่กŒๅŽ๏ผŒๆˆ‘ไปฌๅฏไปฅๅœจbundle.js็š„ๆœ€ๅŽ้ƒจๅˆ†ๆ‰พๅˆฐไปฅไธ‹ไปฃ็ ๅ†…ๅฎน๏ผš

"use strict";
/* harmony export (immutable) */ __webpack_exports__["a"] = square;
/* unused harmony export cube */
function square(x) {
  alert(x * x);
}

function cube(x) {
  alert(x * x * x);
}

ๅฏไปฅๅ‘็Žฐcubeๆ–นๆณ•ไธ€ๆ ท่ขซๅŠ ่ฝฝไบ†๏ผŒ่ฟ™ๅฐฑๆ˜ฏๆฒกๆœ‰ไฝฟ็”จTree-shakingๆ—ถๅ€™็š„ๆ•ˆๆžœใ€‚้‚ฃไนˆ็Žฐๅœจๆœ‰ไธค็งๆ–นๆณ•ๅฏไปฅ่พพๅˆฐ่ฟ™ไธ€ๆ•ˆๆžœใ€‚

  • ๆ›ดๆข่ฟ่กŒๆˆ–่€…ๆ‰“ๅŒ…ๅ‘ฝไปค

    webpack --optimize-minimize

    ๅ†ๆฌก่ฟ่กŒๆ—ถ๏ผŒๅ‘็Žฐbundle.js็š„ๅ†…ๅฎนๅทฒ็ปๅ‘็”Ÿๆ”นๅ˜๏ผŒไนŸๅฏไปฅๅ‘็Žฐcubeๆ–นๆณ•ๅนถๆฒกๆœ‰ๅŠ ่ฝฝ๏ผŒ่€Œๅชๆœ‰square

    function(e,t,r){"use strict";function n(e){alert(e*e)}t.a=n}]);
  • ไฝฟ็”จไธŠๆ–‡demo7ไธญๆๅˆฐ็š„ๆ’ไปถUglifyJsPlugin๏ผŒๆฅๅฎž็ŽฐTree-shakingใ€‚่ฟ™ไนŸๅฏไปฅไปŽไธ€ไธชไพง้ขๅๅบ”ๅ‡บ่ฟ™ไธชๆ’ไปถไผ˜ๅŒ–็š„jsไปฃ็ ็š„ไธ€ไบ›ๆ–นๆณ•ใ€‚

    var UglifyJsPlugin = require('uglifyjs-webpack-plugin');
    module.exports = {
      entry: './main.js',
      output: {
        filename: 'bundle.js'
      },
      plugins: [
        new UglifyJsPlugin()
      ]
    };

    ๅฎŒๆˆๆ‰“ๅŒ…ๅŽๅฏไปฅๅ‘็Žฐ๏ผŒbundle.jsๅ†…ๅฎนไธŽๆ–นๆณ•ไธ€ๅนถๆฒกๆœ‰ไป€ไนˆๅทฎๅˆซ๏ผŒ่ฟ™ไนŸๅๅบ”ไบ†ๆ–นๆณ•ไธ€้€š่ฟ‡ๅ‘ฝไปคไผ˜ๅŒ–็š„ๆ–นๆณ•ๅ…ถๅฎžๅฐฑๆ˜ฏๅŸบไบŽๆœฌๆ–นๆณ•็š„ๆ’ไปถ็š„ใ€‚

้ขๅค–ๆณจๆ„็‚น

  • ๅฆๅค–ๅœจ่ฟ›่กŒTree-shakingๆ—ถ๏ผŒ้œ€่ฆๆณจๆ„ไปฃ็ ไธญๆ˜ฏๅฆๅซๆœ‰ๅ‰ฏไฝœ็”จ็š„ไปฃ็ ใ€‚ๅฆ‚ๆžœๆฒกๆœ‰ๅ‰ฏไฝœ็”จ๏ผŒๅฏไปฅๅœจpackage.jsonไธญ้…็ฝฎsideEffectsไธบfalseๆฅ่กจ็คบๆ‰€ๆœ‰ไปฃ็ ้ƒฝไธๅซๆœ‰ๅ‰ฏไฝœ็”จใ€‚

    {
      "name": "your-project",
      "sideEffects": false
    }
  • ๅ‰ฏไฝœ็”จ็š„ๅฎšไน‰ๆ˜ฏ๏ผŒๅœจๅฏผๅ…ฅๆ—ถไผšๆ‰ง่กŒ็‰นๆฎŠ่กŒไธบ็š„ไปฃ็ ๏ผŒ่€Œไธๆ˜ฏไป…ไป…ๆšด้œฒไธ€ไธชexportๆˆ–ๅคšไธชexportใ€‚ไธพไพ‹่ฏดๆ˜Ž๏ผŒไพ‹ๅฆ‚polyfill๏ผŒๅฎƒๅฝฑๅ“ๅ…จๅฑ€ไฝœ็”จๅŸŸ๏ผŒๅนถไธ”้€šๅธธไธๆไพ›exportใ€‚

  • ้‚ฃไนˆๆ‰€่ฐ“็š„ๆ— ๅ‰ฏไฝœ็”จๅณไปฃ็ ้ƒฝๅฏไปฅๆ”พๅฟƒ่ฟ›่กŒTree-shakingใ€‚ๅฆ‚ๆžœ็กฎๅฎžๆœ‰ไธ€้ƒจๅˆ†ไปฃ็ ๅญ˜ๅœจๅ‰ฏไฝœ็”จ๏ผŒ้‚ฃไนŸๅฏไปฅๅฐ†ๆ–‡ไปถๆ‰€ๅœจ็›ฎๅฝ•ไปฅๆ•ฐ็ป„ๅ…ƒ็ด ็š„ๅฝขๅผๅŠ ๅ…ฅ่‡ณsideEffects็š„ๅฑžๆ€งๅฝ“ไธญใ€‚

ๆ€ป็ป“

่ฆๅญฆไผšไฝฟ็”จTree-shaking๏ผŒ้œ€่ฆๅšๅˆฐไปฅไธ‹ไธ‰็‚น

  1. ไฝฟ็”จ ES2015 ๆจกๅ—่ฏญๆณ•๏ผˆๅณ import ๅ’Œ export๏ผ‰ใ€‚

  2. ๅœจ้กน็›ฎ package.json ๆ–‡ไปถไธญ๏ผŒๆทปๅŠ ไธ€ไธช "sideEffects" ๅ…ฅๅฃใ€‚

  3. ๅผ•ๅ…ฅไธ€ไธช่ƒฝๅคŸๅˆ ้™คๆœชๅผ•็”จไปฃ็ (dead code)็š„ๅŽ‹็ผฉๅทฅๅ…ท(minifier)๏ผˆไพ‹ๅฆ‚ UglifyJSPlugin๏ผ‰ใ€‚

ๆœ€ๅŽๆ›ดๆ–ฐไบŽ

่ฟ™ๆœ‰ๅธฎๅŠฉๅ—๏ผŸ