webpack Config Cheese
webpack.config 简易化配置器,让 webpack 配置变得简单
该配置器已不再维护! 如果你希望继续使用,请转移到 webpack-config-zero。
why?
- webpack 配置繁琐、复杂
- webpack 配置又过于灵活,很多时候在项目初始化时都采用
ctrl + c
,ctrl + v
的方式复制之前项目的webpack.config.js
文件 - 自己创建的多个类型的项目脚手架,针对 webpack 的版本升级、优化,或者打包策略调整时这些脚手架需要逐个修改
How to use?
带“*****”号为可选步骤。
-
安装 Babel 相关依赖:
npm i --save-dev babel-core babel-loader babel-preset-env在项目根目录下配置
.babalrc
:***** 安装 React 需要的代码转换器:
npm i --save-dev babel-preset-react***** 修改
.babelrc
:{"presets": [+ "react",...]} -
安装 postcss-loader 以及其插件的相关依赖:
npm i --save-dev postcss-loader autoprefixer在项目根目录下配置
postcss.config.js
:moduleexports =plugins:;***** 安装 postcss-loader 插件(移动端项目)
npm i --save-dev postcss-px2rem px2rem***** 修改
postcss.config.js
,增加 px2rem 配置:+const px2rem = require('postcss-px2rem');module.exports = {plugins: [...+ px2rem({+ remUnit: 75+ })]};在项目根目录下配置
.browserslistrc
文件:# Browsers that we support> 1%last 5 versionsie 11 -
安装 webpack,需要安装 2.0 之后的版本:
npm install --save-dev webpack@">=2.0.0 < 4.0.0" -
***** 如果是纯前端项目,推荐直接安装 webpack-dev-server 依赖:
npm install --save-dev webpack-dev-server -
***** 安装 react-hot-loader ,可开启 React 热更新功能(默认开启),注意要 3.0 之后的版本。如果是非 React 项目,且不准备安装该模块,注意在
options
中关闭reactHotLoader
功能:npm install --save-dev react-hot-loader@^3.0.0***** 修改
.babelrc
,增加 react-hot-loader 的相关配置: -
***** 如果是 Aconite Node(HJ 内部 Node 框架,之后会考虑自研一套,还在规划中)的前后端不分离项目,开发环境需要安装 koa 中间件:
npm install --save-dev @hujiang/aconite-webpack koa-webpack-dev-middleware koa-webpack-hot-middleware注意,前端代码是位于
/assets/src
下的。 -
现在可以安装我的神器了:
npm install --save-dev webpack-config-cheese -
最后,修改你项目下的
webpack.config.js
,并引入该神器:const cheese = ;moduleexports = cheese;
方法和属性
buildConfig( options )
构建 webpack.config 对象的方法,会根据不同编译环境(NODE_ENV
或者 npm script)生成并返回 webpack.config.js
需要的配置对象。
options
属性 | 数据类型 | 默认值 | 说明 |
---|---|---|---|
compilePaths |
Object | 参见下表 | 需要额外执行 loader 的路径,比如某些 node_modules 下的依赖包(就是本人,呵呵),是没有进行过 loader (ES6, SASS等)转换的 |
polyfills |
Object | { 'babel-polyfill': true, 'whatwg-fetch': true } | 内置的 ES6、fetch 相关的 polyfill,可以设置 false 来关闭 |
spa |
Boolean | true | 单页、多页项目的配置选项。如果设置为 true ,入口文件为 src/index.js ,html 模版为 src/index.html (Aconite Node - HJ 内部项目不使用)。如果为 false ,入口文件为 src/containers 下的各子目录的 index.js ,html 模版为各子目录下的 index.html (Aconite Node - HJ 内部项目不使用),编译输出时,多页模式下的页面名称根据子目录命名,并忽略大小写,如:containers/Home/index.html ,输出为 home.html 。 |
cssModule |
Boolean | true | 开启 cssModules 。设置为 true 时,默认会把 src/styles 下的 css 代码中的 classname 做为global 处理,不再需要额外声明 :global 。 |
reactHotLoader |
Boolean | true | 开启 react-hot-loader,react-hot-loader 版本需要大于 3.0,且需要手动配置 .babelrc ,见上面的安装步骤。 |
runtimePublicPath |
Boolean, String | true | webpack 的动态 publicPath 模块路径,如果为 true ,默认使用 /src/config/public-path.js 路径作为该模块。也可以直接传入自定义路径。另外,在 Node 项目的 View 模板中需要在 window 上输出一个 global 变量,比如:window.static_public_path = '{{ core.staticPublicPath }}'。在需要分割异步 chunk 时,非常有用,参见:Public Path。 |
hostsSplitting |
Boolean | false | 生产环境分离出 hosts.js ,如果在编译后的代码中经常需要修改 api host 来调试,可以开启该功能,但要预先定义 constents/hosts.js 这个模块来分离出 hosts 变量。 |
nodeDevServer |
Boolean | false | 如果是 Aconite Node 的项目(HJ 内部项目),需要开启该设置,否则就要安装 webpack-dev-server |
libChunks |
Array | [] | 生产环境下将指定的第三方模块分离到独立的 lib.js chunk 中 |
manifestOutput |
String | 'manifest.json' | manifest 文件的自定义输出路径及名称,输出路径基于 webpack 的 output.path ,示例:'../../manifest.json'。 |
manifestPublicPath |
String | '' | 输出的 manifest 中的映射路径会加上该前缀,功能类似于 webpack 的 output.publicPath |
projectInfo |
Object | null | 如果设置该参数,同时参数值包含:name, title 字段,编译后将输出 [project-name].json 文件,。输出的文件中将包含:name, title,以及上面的 manifest 资源映射,该参数用于 HJ 内部项目。 |
projectInfoOutput |
String | 'project.json' | [project-name].json 文件的自定义输出路径及名称,输出路径基于 webpack 的 output.path ,示例:'../../project.json',该参数用于 HJ 内部项目。 |
compilePaths
如果传入 compilePaths
下的配置参数,会和下方的默认值合并:
属性 | 数据类型 | 默认值 | 说明 |
---|---|---|---|
babel | Array | [ '/src' ] | 需要 babel-loader 编译的目录路径 |
css | Array | [ '/src', '/node_modules/sanitize' ] | 需要 css-loader 编译的目录路径,支持:*.css, *.scss, *.less |
cssModules | Object | { global: [ '/src/styles', '/node_modules/sanitize' ], local: [ '/src' ] } | 需要开启 css-loader 的 CSS-MODULES 的路径,支持:*.css, *.scss, *.less。注意: 参数 global 下的目录是不会被 CSS-MODULES 执行的目录,这些目录下的代码中不需要手动声明 :global 。 |
res | Array | [ '/src' ] | 需要 file-loader 处理的目录路径,支持:*.jpg, *.png, *.gif, *.svg, *.eot, *.woff, *.ttf, *.svg, *.mp3 |
env
webpack 编译时的环境变量,可能的值:dev, qa, production,暂时先这么定义,与当前 HJ 内部项目相关。
buildConfig 构建出的配置项无法满足?
可以安装 webpack-merge
,然后扩展 buildConfig()
生成后的配置对象:
...const webpackMerge = ; moduleexports = ;
还可以根据不同环境来配置 webpack 扩展项:
let config = cheese; if configenv === 'dev' config = ; else config = ; moduleexports = config;
构建环境规范
目录规范
├── dist // 编译输出目录
├── lib // 存放第三方非模块化(node_modules)的代码库,如果有的话。发布时,需要手动上传到 res.hjfile.cn/tool/lib/ 下 (HJ 内部使用)
└── src // 源码目录
├── constants
│ └── hosts.js // 配置不同环境下 api 接口的 host 变量,验证、生产环境不会被压缩,便于修改调试
├── containers // 页面容器目录(只有多页需要以下规范,每个目录表示一个页面)
│ ├── App
│ │ ├── index.html // Aconite Node 项目不需要
│ │ ├── index.js // 如果开启 react-hot-loader,该模块作为热更新的入口,页面逻辑约定在 main.js 中,具体见:react-mpa 脚手架项目
│ │ └── main.js // 只有在 react 多页脚手架中出现
│ └── Page2
│ ├── index.html
│ ├── index.js
│ └── main.js
├── styles // 如果开启 css-modules,该目录会自动做为 global 模式编译,不需要手动在 css 中声明 ":global"
├── index.html // 在 spa 模式中出现(Aconite Node 项目不需要)
└── index.js // 在 spa 模式中出现
package.json
的 scripts 规范
纯前端项目
"scripts":
Aconite Node (HJ 内部项目)前后端不分离项目
"scripts": ,