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
ๅ ็ๆไปถ็ฎๅฝ

ๅ ถไธญ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ๅฐฑๆฏ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

็ธๆฏไบ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็็ฎๅฝ๏ผๆ นๆฎๅๅ ไธชๆ ทไพ๏ผๆไปฌๅพๆๆพๅฐฑ่ฝ็ฅ้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่ตๅผ็ปไบไธไธชๅ ็ด ๏ผๅๆฅ็ไธไธ่ฟ่กๆๆใ

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็ๆไปถ็ฎๅฝ

// 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่ฟ่กไบไปฃ็ ๅๅฒๅค็ใ้่ฟ่ฟ็งๆนๆณๅผๅ ฅ็ไปฃ็ ๏ผๅจๆๅ ๅไผ่ขซๅๅฒ๏ผๅนถไธๅจ้่ฆๆถ่ฟ่กๅ ่ฝฝใ

ๅฝ็ถๅจ่ฟไธชๆ ทไพไธญๅนถไธ่ฝ็ๅฐๆๆพ็ๆ้ๅ ่ฝฝๆๆ๏ผๅจ็้ขๆๅผๆถ่ฟไธคไปฝๆไปถ้ฝๆๆๅ ้ๆฑ๏ผๆไปฅ้ฝ่ฟ่กไบๅ ่ฝฝใ
ๅจ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
ๅ ๆฅ็ๆไปถ็ปๆไธ้จๅๆไปถๅ ๅฎน

// 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้ใ

็ฑไบๅ ฌๅ ฑ้จๅ็้ๅคๅญๅจ๏ผๆไปฅๅฏนไบๅ ่ฝฝๆฅ่ฏดๆฏไธ็งๅพๅคง็ๆตช่ดน๏ผ่ฟๅฐฑๆฏ่ฟไธช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ๅ ่ขซๅผๅ ฅใ

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๏ผ้่ฆๅๅฐไปฅไธไธ็น
ไฝฟ็จ ES2015 ๆจกๅ่ฏญๆณ๏ผๅณ import ๅ export๏ผใ
ๅจ้กน็ฎ package.json ๆไปถไธญ๏ผๆทปๅ ไธไธช "sideEffects" ๅ ฅๅฃใ
ๅผๅ ฅไธไธช่ฝๅคๅ ้คๆชๅผ็จไปฃ็ (dead code)็ๅ็ผฉๅทฅๅ ท(minifier)๏ผไพๅฆ UglifyJSPlugin๏ผใ
ๆๅๆดๆฐไบ
่ฟๆๅธฎๅฉๅ๏ผ