其实以前也会看一些 webpack 脚手架的配置,可是使用的插件实在是太多了,不了解各个插件的左右是一个很大的瓶颈,因此着手认识认识各大插件。css
项目地址,以前一直都是用脚手架工具,最近得闲就学习了花裤衩大佬的手摸手系列,本身按着实现一下,顺便记录一下知识点。html
项目使用 yarn,以前用主要使用 cnpm,可是老是会有些漏包的问题,因此以后改用了 yarn,我的确实以为 yarn 在国内来讲更友好。vue
yarn init / npm init // 建立 package.json
复制代码
build // 存储打包相关文件
config // 配置变量
src // 项目资源文件
static // 静态文件
复制代码
其余的具体配置看源码就行了,我在这里主要介绍一下相关的几个插件(基于 webpack 4.0)node
webpack 4.0 须要安装 webpack-cliwebpack
yarn add --dev webpack-cli webpack webpack-dev-server webpack-merge
复制代码
webpack-cli // webpack 脚手架,包含了不少内置方法(例如:--compress, --color)
webpack-dev-server // 配置开发环境服务
webpack-merge // 用于合并 webpack 公共配置,缩减代码量,使代码更清晰
复制代码
devServer:{
contentBase: false,
//我这里没有设置contentBase,我的研究contentBase必须指向存在的bundle.js文件所在目录,
//由于这里是开发模式,因此dist目录并不存在,因此用false.
host:' localhost',
port: '8888',
inline:true,//webpack官方推荐
watchOptions: {
aggregateTimeout: 2000,//浏览器延迟多少秒更新
poll: 1000//每秒检查一次变更
},
compress: true,//一切服务都启用gzip 压缩
historyApiFallback: true,//找不到页面默认跳index.html
hot: true,//启动热更新,必须搭配new webpack.HotModuleReplacementPlugin()插件
open: true,
}
复制代码
webpack-dev-server 其余配置项以及在 package.json 中的快捷实用git
devServer 还有如下属性es6
// 在全部响应中添加首部内容
headers: {
"X-Custom-Foo": "bar"
}
复制代码
// 默认状况下,dev-server 经过 HTTP 提供服务。也能够选择带有 HTTPS 的 HTTP/2 提供服务
https: true
// 以上设置使用了自签名证书,可是你能够提供本身的:https: {
key: fs.readFileSync("/path/to/server.key"),
cert: fs.readFileSync("/path/to/server.crt"),
ca: fs.readFileSync("/path/to/ca.pem")
}
复制代码
// 当存在编译器错误或警告时,在浏览器中显示全屏覆盖。默认状况下禁用。若是只想显示编译器错误:
overlay: true
// 若是您想显示警告和错误:
overlay: {
warnings: true,
errors: true
}
复制代码
若是你不想始终传递 /api,则须要重写路径:proxy: {
"/api": {
target: "http://localhost:3000",
pathRewrite: {"^/api" : ""}
}}
复制代码
--allowed-hosts
// host 白名单github
--color
// CLI only 控制台信息颜色web
--compress
// CLI only 一切服务都启用gzip 压缩npm
--inline
// 默认为 true, false 为 iframe 模式。 在 dev-server 的两种不一样模式之间切换。默认状况下,应用程序启用内联模式(inline mode)。这意味着一段处理实时重载的脚本被插入到你的包(bundle)中,而且构建消息将会出如今浏览器控制台。也可使用iframe 模式,它在通知栏下面使用标签,包含了关于构建的消息。切换到iframe 模式:
--open
// 自动打开浏览器 --open 'Google Chrome': 自动打开谷歌浏览器
--openPage
// 自动打开的页面路径 如 webpack-dev-server --open-page "/different/page"
--progress
// 将运行进度输出到控制台
yarn add --dev html-webpack-plugin@next
复制代码
// webpack.xxx.js
const HtmlWebpackPlugin = require('html-webpack-plugin')
... ...
// plugin中须要引入配置
new HtmlWebpackPlugin({
template: 'index.html',
filename: 'index.html',
inject: true,
favicon: resolve('favicon.ico'),
title: 'webpack demo',
minify: { // 压缩 HTML 的配置
minifyCSS: true, // 压缩 HTML 中出现的 CSS 代码
minifyJS: true, // 压缩 HTML 中出现的 JS 代码
removeComments: true, // 移除注释
collapseWhitespace: true, // 缩去空格
removeAttributeQuotes: true // 移除属性引号
}
})
复制代码
index.html 中使用 plugin 配置的变量
// index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<div id="app"></div>
</body>
</html>
复制代码
做用:在webpack中拷贝文件和文件夹, 打包的时候须要配置使用
// webpack.prod.js
const CopyWebpackPlugin = require('copy-webpack-plugin')
plugins: [
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: path.resolve(__dirname, '../dist/static'),
ignore: ['.*']
}
])
]
复制代码
此插件将CSS提取到单独的文件中。它为每一个包含CSS的JS文件建立一个CSS文件。它支持CSS和SourceMaps的按需加载。它创建在新的webpack v4功能(模块类型)之上,而且须要webpack 4才能工做。
yarn add --dev mini-css-extract-plugin
复制代码
// 生产环境压缩须要使用 optimize-css-assets-webpack-plugin 配合使用
const TerserJSPlugin = require('terser-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
module.exports = {
optimization: {
minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})],
},
plugins: [
new MiniCssExtractPlugin({
filename: '[name].css',
chunkFilename: '[id].css',
}),
],
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css-loader'],
},
],
},
};
复制代码
webpack 配置 babel 须要安装 babel-core、babel-preset-env、babel-loader、 babel-plugin-transform-runtime
babel-core:是babel的核心编译器
babel-preset-env: 是一个配置文件,能够根据此配置文件让目标浏览器或者运行环境来自动将ES2015+的代码转换为es5,得以向下兼容
babel-loader: webpack 插件,预处理文件
babel-plugin-transform-runtime: 禁用了 babel 自动对每一个文件的 runtime 注入,而是引入 babel-plugin-transform-runtime 而且使全部辅助代码从这里引用。
yarn add --dev babel-loader @babel/core @babel/preset-env @babel/runtime @babel/plugin-transform-runtime
复制代码
babel-loader^8.0.0 安装的 babel-core 以及 babel-preset-env 和之前不一样, 具体使用详见 babel-loader,
以上插件须要用如下的替换
"@babel/core": "^7.4.5",
"@babel/plugin-transform-runtime": "^7.4.4",
"@babel/preset-env": "^7.4.5",
"@babel/runtime": "^7.4.5",
复制代码
// webpack.config.js
module: {
rules: [
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
plugins: ['@babel/transform-runtime']
}
}
}
]}
复制代码
在 .babelrc 中添加插件
// .babelrc
{
"plugins": ["@babel/plugin-transform-runtime"]
}
复制代码
eslint 主要用于检查语法错误,配合 prettier,vscode 配置插件,能够统一代码风格 须要安装 eslint、eslint-loader、babel-eslint、eslint-config-standard、eslint-friendly-formatter
yarn add --dev eslint eslint-loader babel-eslint eslint-config-standard eslint-friendly-formatter
复制代码
babel-eslint: 解析器 eslint-config-standard: 官方推荐标准配置 eslint-friendly-formatter: 使 eslint 报错的更友好 eslint-plugin-vue: vue相关配置
这里使 eslint-config-standard,还须要安装一下插件
yarn add --dev eslint-plugin-html eslint-plugin-import eslint-plugin-node eslint-plugin-promise
复制代码
// .eslintrc.js
module.exports = {
root: true,
parserOptions: {
parser: 'babel-eslint',
sourceType: 'module'
},
env: {
browser: true,
node: true,
es6: true
},
extends: "eslint: standard", // 引用 扩展规则
rules: {
"indent": ["error", 2],
"quotes": ["error", "double"],
"semi": ["error", "always"],
"no-console": "error",
"arrow-parens": 0
}
}
复制代码
《未完待续...》