- webpack-box 是一个对 webpack 进行了封装的开箱即用的项目。集成了 webpack 的各种优化,配置了 webpack 常用到的 loader 和 plugin,原则上您不需要做任何配置就可以使用。
- webpack-box 支持插件配置,您可以使用插件管理项目配置,可以多项目复用
- 您也可以当作参考手册,来这里找到任何想要的 webpack 配置
- 如果想要从头系统学习,可以切换到不同分支上,我把每课时的内容都分别切成了不同的分支,您可以在这些分支上自由尝试
- 学习webpack
点击关闭/打开安装
webpack-box
针对某个项目使用,可以在本地 npm script
内使用,也可以全局使用
npm i @pkb/webpack-box -D # 本地安装
npm i @pkb/webpack-box -g # 全局安装
点击关闭/打开使用
# --- 项目构建 ---
webpack-box dev # 开发环境
webpack-box build # 生产环境
webpack-box dll # 编译差分包
webpack-box dev index # 指定页面编译(多页面)
webpack-box build index # 指定页面编译(多页面)
webpack-box build index --report # 开启打包分析
webpack-box build:ssr # 编译ssr
webpack-box ssr:server # 在 server 端运行
# --- 切换 webpack 版本 ---
webpack-box upgrade 5 # 可以切换到 webpack5/4
# --- 检查配置 ---
webpack-box inspect > output.json # 导出所有配置到 output.json
webpack-box inspect --rules # 查看所有 loader 列表
webpack-box inspect --rule babel # 查看指定 loader 配置
webpack-box inspect --plugins # 查看所有插件列表
webpack-box inspect --plugin mini-css-extract # 查看指定插件配置
# --- graphql ---
webpack-box server:gql # graphql-server
# --- 插件命令及安装 ---
# npm i -D @pkb/plugin-eslint
webpack-box eslint # 自动修复 eslint 错误
# npm i -D @pkb/plugin-tslint
webpack-box tslint # 自动修复 tslint 错误
# npm i -D @pkb/plugin-stylelint
webpack-box stylelint # 自动修复 stylelint 错误
在 package.json 中使用
{
"scripts": {
"dev": "webpack-box dev",
"build": "webpack-box build",
...
}
}
- BundleAnalyzerPlugin 打包分析
- CompressionWebpackPlugin 严格区分大小写
- dll-plugin 查分包配置
- EnvironmentPlugin 定义通用变量
- fork-ts-checker 检查ts类型
- friendly-errors-webpack-plugin 友好错误提示
- html-webpack-plugin 生成html
- mini-css-extract-plugin 提取样式
- PreloadWebpackPlugin preload 预加载
- progress-bar-webpack-plugin 构建时添加进度条配置
- alias 别名配置
- assets 加载资源 images、svg、media、fonts
- babel-loader babel-loader 配置
- base 基础配置
- CaseSensitivePaths 严格区分大小写
- dashboard 增加仪表盘配置
- devServer.before 在devServer中添加中间件,mock数据
- webpack-manifest-plugin 提取 manifest
- optimization 优化配置
- style 样式表配置,包括 less\sass\stylus\postcss
- global style 全局样式变量
- thread 多线程配置
- tslint ts 检查配置
webpack-box.config.js
const path = require('path')
function resolve(dir) {
return path.join(process.cwd(), dir)
}
module.exports = function (config) {
/**
* @param {object} dll 开启差分包
* @param {object} pages 多页面配置 通过 box run/build index 来使用
* @param {function} chainWebpack
* @param {string} entry 入口
* @param {string} output 出口
* @param {string} publicPath
* @param {string} port 端口
* @param {object} eslint eslint 配置
* @param {object} stylelint stylelint 配置
* @param {object} eslint eslint 配置
* @param {object} alias 配置别名
* @param {object} env 配置通用变量,可以在 node 跟 web 之间共同使用
* @param {Boolean} filenameHashing 文件名是否使用 hash,当文件发生变动的时候 filename 才会改变
* @param {Boolean} css 配置 css
* @param {Boolean} mock 开启 mock
*/
return {
pages: {
index1: {
entry: 'src/main.js',
template: 'public/index.html',
filename: 'index.html',
publicPath: './',
output: 'dist/index1'
},
index2: {
entry: 'src/main.js',
template: 'public/index2.html',
filename: 'index2.html',
publicPath: './',
output: 'dist/index2'
}
},
port: 9001,
mock: true,
env: {
REACT: 'react' // 配置 react
},
alias: {
'@': resolve('src'),
'@src': resolve('src')
},
resources: {
less: {
patterns: [
path.resolve(__dirname, './src/global/*.less')
]
},
scss: {
patterns: [
path.resolve(__dirname, './src/global/*.scss')
]
}
},
css: {
sourceMap: true,
loaderOptions: {
css: {},
less: {
globalVars: {
gray: '#ccc'
}
},
sass: {},
postcss: {},
stylus: {}
},
isCssModule: false, // 是否对css进行模块化处理
needInlineMinification: false // 是否需要压缩css
},
filenameHashing: true,
eslint: {
lintOnSave: true, // 开启运行时检测
extensions: ['js', 'jsx', 'vue'] // 默认 ['js', 'jsx']
},
tslint: {
lintOnSave: true, // 开启运行时检测
useThreads: true
},
stylelint: {
lintOnSave: true // 开启运行时检测
// extensions: ['vue', 'htm', 'html', 'css', 'sss', 'less', 'scss']
},
// dll: {
// venders: ['react']
// },
chainWebpack(config) {}
}
}