总结一下webpack
webpack各种配置
- webpack-dev-server
webpack-dev-server用来创建本地服务器,监听你的代码修改,并自动刷新修改后的结果。
这里配置devServer就是配置webpack-dev-server的。
context
这是entry配置项的根目录(绝对路径)。如果output.pathinfo也设置了,它的pathinfo是基于这个根目录。
context:__dirname + './src'
entry
有三种方式 字符串 数组 对象
一个入口文件:字符串
1entry: "./src/js/root.js"多个入口文件打包成一个:数组
1entry:['./entry1','./entry2']多入口文件打包多个文件:对象
1234entry: {app:"./src/js/root.js",app2:"./src/js/root2.js",}注意 output中需要使用占位符等方法来解决导出的模块文件相互覆盖的问题:
占位符:[name] => app,app2 [hash] => 打包的hash值 [chunkhash] => chunk的hash值
output
|
|
配置多个入口同时配置多个出口文件,可以用[name].js
|
|
resolve
|
|
Loader
module.loaders => module.rules webpack 4以上。
loader的作用:
1、实现对不同格式的文件的处理,比如说将scss转换为css,或者typescript转化为js
2、转换这些文件,从而使其能够被添加到依赖图中
|
|
这里介绍几个常用的loader:
babel-loader: 让下一代的js文件转换成现代浏览器能够支持的JS文件。
babel有些复杂,所以大多数都会新建一个.babelrc进行配置
css-loader,style-loader:两个建议配合使用,用来解析css文件,能够解释@import,url()如果需要解析less就在后面加一个less-loader
file-loader: 生成的文件名就是文件内容的MD5哈希值并会保留所引用资源的原始扩展名
url-loader: 功能类似 file-loader,要先下载file-loader
rules => 4.0以上用 rules use
用过的loader
postcss-loader
配置postcss.config.js
1234567
const autoprefixer = require('autoprefixer');// autoprefixer CSS代码加浏览器前缀module.exports = { plugins: [ autoprefixer() ]};
.babelrc => 配置 babel 转义的文件
12345678
{ "presets": [ "env" // babel-preset-env 转译es6的插件 ], "plugins": [ "transform-vue-jsx" // 解析vue中的jsx ]}
Plugins
HtmlWebpackPlugin 打包html页面
作用: 依据一个简单的index.html模版,生成一个自动引用你打包后的js文件的新index.html
var HTMLWebpackPlugin = require(‘html-webpack-plugin’)
plugins: [
new htmlWebpackPlugin({
filename: ‘./dist/index.html’, => 打包后的目录 注意:output中的path会影响的
template: ‘index.html’, => 要打包的html名称
inject: ‘body’, => output 打包后的js文件在 body标签中引入
title:’title’, => 可以用ejs语法获取到,
minify:{
removeComments:true,
collapseWhitespace:true
},
chunks:[‘a’,’c’],
excludeChunks:[‘a’,’b’] // 不引用 ‘a’,’b’ 与chunks不同时用
})
]
HotModuleReplacementPlugin: 它允许你在修改组件代码时,自动刷新实时预览修改后的结果注意永远不要在生产环境中使用HMR。
多页面打包
就是多个 new htmlWebpackPlugin();
想要引用不同的js,则改变 chunk
extract-text-webpack-plugin => 单独打包css
const ExtractPlugin = require('extract-text-webpack-plugin');
config.module.rules.push({
test: /\.styl/,
use: ExtractPlugin.extract({
fallback: 'style-loader',
use: [
'css-loader',
{
loader: 'postcss-loader',
options: {
sourceMap: true
}
},
'stylus-loader'
]
})
});
config.plugins.push(
new ExtractPlugin('styles.[contentHash:8].css')
);
如果报错Tapable.plugin is deprecated. Use new API on `.hooks` instead
则下载 extract-text-webpack-plugin@next
压缩
|
|
这时output只小了一些。
再将入口分开
|
|
|
|
性能检测
|
|
生成json文件,可以性能检测了
网址:
(https://chrisbateman.github.io/webpack-visualizer/);
(http://webpack.github.io/analyse/#home);
(https://alexkuz.github.io/webpack-chart/);
(https://alexkuz.github.io/stellar-webpack/);
启动
|
|
打包发布 build上线 / dev开发
if(isDev){
config.devServer = {
port:8000,
host:'0.0.0.0',
overlay:{
errors:true
},
hot:true
}
config.plugins.push(
new webpack.HotModuleReplacementPlugin(), //热更新
new webpack.NoEmitOnErrorsPlugin()
)
config.module.rules.push(
{
test:/\.styl/,
use: [
'style-loader',
'css-loader',
{
loader: 'postcss-loader',
options: {
sourceMap: true
}
},
'stylus-loader'
]
}
)
} else {
config.entry = { // 将所用到的类库单独打包
app: path.join(__dirname, 'src/index.js'),
vendor: ['vue']
};
config.output.filename = '[name].[chunkhash:8].js';
config.module.rules.push({
test: /\.styl/,
use: ExtractPlugin.extract({
fallback: 'style-loader',
use: [
'css-loader',
{
loader: 'postcss-loader',
options: {
sourceMap: true
}
},
'stylus-loader'
]
})
});
config.plugins.push(
new ExtractPlugin('styles.[contentHash:8].css')
);
}
模块安装
提示 invariant,babel-messages,repeating 没有找到,要全局安装,不然会陷入 无限循环