Webpack2 视频学习笔记

webpack

好几天没写博客了,今天在想博客怎么处理,突然发现大神 博客 有很多前端视频教程,就顺便把之前学的 Webpack 补一补,之前的 《纯 React&纯 Redux》 的笔记中的 Webpack 和这个 Webpack 2 互为补充,我就不做分离了。因为是给自己看的,所以这是个超级不负责任的笔记。

001 - Webpack 简介

Webpack 前端资源模块化管理和打包工具。通过加载器 (loader) 的转换,任何形式的资源都可以视为模块。

《React 与 Redux 开发实例精解》 Webpack 做这些事。

  • 编译、加载使用 ES2015 和 JSX 语法的模块
  • 实现开发服务器和热替换
  • 加载图片文件
  • 加载字体文件
  • 加载样式文件
  • 加载 Json 文件
  • 使用同构工具实现同构渲染
  • 压缩代码
  • 哈希命名

002 - NodeJS 安装与配置

这个不说了,看视频

003 - Webpack 项目初始化

初始工作

1
2
3
4
# 安装 node 和 npm
# 创建文件夹,并初始化项目
$ mkdir 003
$ npm init -y

安装 webpack 模块:

1
2
$ npm install webpack --save-dev #这是局部的
$ npm install webpack -g #这是全局的

创建文件:

1
2
3
$ mkdir app
$ cd app
$ touch index.js
1
2
//app/index.js
console.log("hello world")

打包:

1
$ webpack app/index.js build/bundle.js

经过这一步,build文件夹下面就会出现一个bundle.js文件

004 - Webpack 初体验

下面,我们来使用一个插件,来体验一下用 webpack 做网页。

准备:

1
2
$ npm install html-webpack-plugin --save-dev
$ touch webpack.config.js

编写代码:

1
2
3
// app/index.js
import component from './component.js'
document.body.appendChild(component())
1
2
3
4
5
6
// app/component.js
export default (text = 'hello world') => {
const element = document.createElement('div');
element.innerHTML = text;
return element
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// webpack.config.js
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')

const PATHS = {
app: path.join(__dirname, 'app'),
build: path.join(__dirname, 'build')
};

module.exports = {
entry: {
app: PATHS.app,
},
output: {
path: PATHS.build,
filename: '[name].js',
},
plugins: [
new HtmlWebpackPlugin({
title: 'Webpack demo'
})
]
}

运行

1
$ webpack

结果

1
2
3
build
├── app.js
└── index.html#这是我用插件帮忙生成的

005 - Webpack 编译输出日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
➜  004 webpack
Hash: cc2d357e75c09b6ce858
Version: webpack 3.0.0# 版本
Time: 884ms # 编译用时
# 输出 大小
Asset Size Chunks Chunk Names
app.js 3.06 kB 0 [emitted] app
index.html 180 bytes [emitted]
## 用了那些文件
[0] ./app/index.js 78 bytes {0} [built]
[1] ./app/component.js 135 bytes {0} [built]
## 用了什么插件
Child html-webpack-plugin for "index.html":
[2] (webpack)/buildin/global.js 509 bytes {0} [built]
[3] (webpack)/buildin/module.js 517 bytes {0} [built]
+ 2 hidden modules

006 - 使用快捷方式进行编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//package.json
{
"name": "004",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack --env production"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"html-webpack-plugin": "^2.29.0",
"webpack": "^3.0.0"
}
}

运行:

1
$ npm run build

查看scripts命令

如果想看 package.json 中的脚本有哪些,再也不用手动打开 package.json 文件了。

1
2
3
4
5
6
7
8
$ npm run
Lifecycle scripts included in 004:#项目名 004
test # 脚本名 test
echo "Error: no test specified" && exit 1

available via `npm run-script`:
build #脚本名 build
webpack --env production

007 - 配置 WDS 进行浏览器自动刷新

安装 webpack-dev-server

1
$ npm i webpack-dev-server --save-dev

配置 script:

1
2
3
4
"script":{
...
"start":"webpack-dev-server --env development"
}

运行:

1
2
$ npm start
#实时监听文件变化,全局刷新

008 - WDS 端口号等配置相关

1
2
3
4
5
6
7
8
//webpack.config.js
module.exports ={
devServer: {
host: process.env.HOST,
port: process.env.PORT
},
...
}

009 - 配置 ESLint 实现代码规范自动测试 (上)

配置一个 ESLint 来虐自己吧 O(∩_∩)O

安装:

1
npm i eslint --save-dev

配置:

1
2
3
4
5
// package.json
"script":{
....
"lintjs": "eslint app/ webpack.*.js --cache"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// .eslintrc.js
module.exports = {
env: {
browser: true,
commonjs: true,
es6: true,
node: true,
},
extends: 'eslint:recommended',
parserOptions: {
sourceType: 'module',
},
rules: {
'comma-dangle': ['error', 'always-multiline'],
indent: ['error', 2],
'linebreak-style': ['error', 'unix'],
quotes: ['error', 'single'],//引号
semi: ['error', 'always'],//分号
'no-unused-vars': ['warn'],//不使用的变量警报
'no-console': 0,//不能用 console 打印
},
};

运行:

1
$ npm run eslintjs

自动修复 error:

1
$ npm run eslintjs --fix

010 - 配置 ESLint 实现代码规范自动测试 (下)

上一节好麻烦,现在我们来一边打包一边检测

安装加载器:

1
npm i eslint-loader --save-dev

配置加载器:

1
2
3
4
5
6
7
8
9
10
11
12
// webpack.config.js
module: {
rules: [{
test: /\.js$/,
enforce: 'pre',

loader: 'eslint-loader',
options: {
emitWarning: true,
},
}]
}

运行:

1
$ npm start

浏览器显示 ESLint 错误:

为了不用切换 Terminal 、Chrome、sublime 之前切换,我们把错误直接抛到显示器上,Terminal 只处理打包,Chrome 看语法错误,在 sublime 修改就好了。

1
2
3
4
5
6
7
8
9
10
11
12
// webpack.config.js
module.exports = {
devServer: {
host: process.env.HOST, // Defaults to `localhost`
port: 80, // Defaults to 8080
overlay: {
errors: true,
warnings: true,
},
},
...
}

011 - Webpack2 中加载 CSS 的相关配置与实战

webpack 除了能打包 js 文件,我们还能打包各种资源,这次先来栏加载 css 文件的加载方法。

安装加载器:

1
$ npm i css-loader style-loader --save-dev

配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
// webpack.config.js 的 module: {rules:[写在这里]
test: /\.css$/,
exclude: /node_modules/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
modules: true,
},
},
]
}

012 - 理解 Webpack 中的 CSS 作用域与 CSS Modules

为了防止 CSS 同名冲突。所以就有了这个。用上一节的配置,写上注释

1
2
3
4
5
6
7
8
9
10
11
12
13
// webpack.config.js 的 module: {rules:[写在这里]
test: /\.css$/,
exclude: /node_modules/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
modules: true,//作用于
},
},
]
}

013 - 自动分离 CSS 到独立文件

之前所以的 css、js 都打包成了 js。而浏览器最后才加载 js。如果把 css 放在 js 中,网页刷新就会闪一下,因为网页在没有加载 js 时,是没有 css 样式的(有浏览器默认样式)。所以我们有必要把 css 分离出来。

安装:

1
$ npm i extract-text-webpack-plugin --save-dev

配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// webpack.config.js
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const plugin = new ExtractTextPlugin({
filename: '[name].css',
ignoreOrder: true,
});
// rules 修改
reles:[{
test: /\.css$/,
exclude: /node_modules/,
use: plugin.extract({
use: {
loader: 'css-loader',
options: {
modules: true,
},
},
fallback : 'style-loader',
}),
}]

plugins: [
new HtmlWebpackPlugin({
title: 'Webpack demo',
}),
plugin,
]

014 - 深入理解 Webpack 2 中的 loader

一般 loader 加载顺序是从右到左的,当然你可以设置前置加载,把东西提到前面先加载。

这节太难了吧,自己去文档看。

015 - Webpack 2 中的文件压缩

自动检查大小:

1
2
3
4
5
6
// webpack.config.js
performance: {
hints: 'warning', // 'error'
maxEntrypointSize: 100000, // bytes 编译出来的大小限制
maxAssetSize: 450000, // bytes 资源大小限制
},

webpack 命令压缩:

1
webpack -p

插件压缩:

1
npm i babili-webpack-plugin --save-dev
1
2
3
4
5
6
7
8
9
10
11
// webpack.config.js
const BabiliPlugin = require('babili-webpack-plugin');
/*******/
plugins: [
new HtmlWebpackPlugin({
title: 'Webpack demo',
}),
plugin,
new BabiliPlugin(),
]

016 - Webpack 2 中生成 SourceMaps

为什么要用这个?:

webpack 对我们的代码进行了混淆,调试根本没法用了。所以我们需要这个东西,视频的例子貌似还有自己找文件,我自己在 《纯 React&纯 Redux》 中记录了另一个方法。

1
2
3
4
//webpack.config.js
//devtool: 'cheap-module-eval-source-map',
//devtool 是生成源码映射(source map),方便调试。开发时点击控制台警报可以调到源码位置而不是编译后的代码
devtool: 'source-map',

017 - Webpack 2 中分离打包项目代码与组件代码

1
2
3
4
5
6
// webpack.config.js
entry:{
app: PATHS.app,
vendor:['react']
}
// 会打包成 app 和 vendor 文件
1
2
3
4
5
6
7
8
9
10
plugins: [
new HtmlWebpackPlugin({
title: 'Webpack demo',
}),
plugin,
new BabiliPlugin(),
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
}),
],

引入的时候先 vendor 在 app

18 - 使用可视化图表进行统计分析打包过程

1
2
3
"script":{
"stats": "webpack --env production --profile --json > stats.json"
}

官方可视化工具

webpack-chart

使用可视化图表对 Webpack 2 的编译与打包进行统计分析

019 - Webpack 2 中配置多页面编译

看视频

020 - Webpack 2 中的 HMR ( Hot Module Replacement )

看视频,不写了

—————- 分割线 —————-

参考资料

Webpack 中文文档:

Webpack 教程:

其他:


Webpack2 视频学习笔记
https://bubao.github.io/posts/cc2211e3.html
作者
一念
发布于
2017年7月3日
许可协议