工作过程中对于前端模块打包的小结
- 代码拆分:Webpack 有两种组织模块依赖的方式,同步和异步。异步依赖作为分割点,形成一个新的块。在优化了依赖树后,每一个异步区块都作为一个文件被打包。
- Loader:Webpack 本身只能处理原生的 JavaScript 模块,但是 loader 转换器可以将各种类型的资源转换成 JavaScript 模块。这样,任何资源都可以成为 Webpack 可以处理的模块。
- 智能解析:Webpack 有一个智能解析器,几乎可以处理任何第三方库,无论它们的模块形式是 CommonJS、 AMD 还是普通的 JS 文件。甚至在加载依赖的时候,允许使用动态表达式 require(“./templates/” + name + “.jade”)。
- 插件系统:Webpack 还有一个功能丰富的插件系统。大多数内容功能都是基于这个插件系统运行的,还可以开发和使用开源的 Webpack 插件,来满足各式各样的需求。
- 快速运行:Webpack 使用异步 I/O 和多级缓存提高运行效率,这使得 Webpack 能够以令人难以置信的速度快速增量编译。
Global: npm install webpack -g
- 执行 webpack ,编译入口文件 entry.js 并打包到 bundle.js,
webpack entry.js bundle.js
- 编译配置文件 webpack.config.js,去配置 entry.js 文件和 bundle.js 文件路径
1
2
3
4
5
6
7
8
9
10
|
var webpack = require('webpack')
module.exports = {
entry: './entry.js',
output: {
path: __dirname,
filename: 'bundle.js'
}
}
|
Library
- 初始化项目
npm init
生成 package.js
- 安装jquery依赖
npm install --save-dev
Loader
- 安装loader
npm instal css-loader style-loader -save-dev
- 修改配置文件模块
module
- 安装Babel 包, Babel 是编写下一代 JavaScript 的编译器。这个包允许使用 Babel 和 webpack 转换 JavaScript 文件
- babel-loader配置
- 安装命令
npm install babel-loader babel-core babel-preset-es2015 babel-plugin-transform-runtime babel-preset-stage-0 --save-dev
- 在 webpack.config.js 里配置 babel
- 排除匹配文件夹可提高执行速度,多个文件夹写法
exclude: /(node_modules|bower_components)/,
1
2
3
4
5
6
7
8
9
10
11
|
babel: {
presets: ['es2015', 'stage-0'],
plugins: ['transform-runtime']
}
//或者放在 .babelrc文件中
{
presets: ['es2015', 'stage-0'],
plugins: ['transform-runtime']
}
|
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
|
var webpack = require('webpack');
module.exports = {
entry: './entry.js',
output: {
path: __dirname,
filename: 'bundle.js'
},
module:{
loaders: [
{
test: /\.css$/,
loader: "style-loader!css-loader"
},
{
test: /\.js$/,
loader: "babel-loader",
exclude:/node_modules/,
query: {
presets: ['es2015', 'stage-0'],
plugins: ['transform-runtime']
}
}
]
}
}
|
结合vue进行组件化开发
- 安装 vue 组件
npm install vue vue-loader vue-html-loader vue-style-loader --save-dev
- 在 webpack.config.js 中引入 vue-loader
- 需要实时编译模板,而非使用自带的runtime-only,需要引入如下配置
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
28
29
30
31
32
33
34
35
36
|
var webpack = require('webpack');
module.exports = {
entry: './entry.js',
output: {
path: __dirname,
filename: 'bundle.js'
},
module:{
loaders: [
{
test: /\.css$/,
loader: "style-loader!css-loader"
},
{
test: /\.js$/,
loader: "babel-loader",
exclude:/node_modules/,
query: {
presets: ['es2015', 'stage-0'],
plugins: ['transform-runtime']
}
},
{
test: /\.vue$/,
loader: "vue-loader"
}
]
},
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm.js' // 'vue/dist/vue.common.js' for webpack 1
}
}
}
|
命令
- webpack –display-modules
- webpack –display-modules –display-reasons
- webpack -d devtools
- webpack -p 执行优化文件压缩
- webpack -w 后台监控代码修改自动执行webpack
webpack-dev-server
- 全局安装
npm install webpack-dev-server -g
- 执行
webpack-dev-server --inline --hot
配置文件和插件
- 区分线上和线下的变量
debug = process.env.NODE_ENV !== "production"
;
- 修改配置文件如下
- 生成json文件
webpack -- profile --json > demo.js
,使用 webpack-analyse上传你的json文件进行分析,或者推荐使用另外一种比较不错的插件webpack-visualizer
1
2
3
4
5
6
7
8
9
10
11
12
|
//是否生成sourcemap
//线上引用插件相关 https://github.com/webpack/docs/wiki/list-of-plugins
{
debug = process.env.NODE_ENV !== "production
"devtools": debug ? "sourcemap" : null,
"plugins": debug ? [] : [
new webpack.optimize.DedupePlugin(),
new webpack.optimize.OccurenceOrderPlugin(),
new webpack.optimize.UgifyJsPlugin({mangle: false, sourcemap: false}),
]
}
|