完整的webpack4的配置clone地址: https://github.com/ziwei3749/...css
开发环境的搭建,整体而言就比较轻松,由于用户就是开发者们。html
你不须要考虑 hash 是否稳定、代码提取是否正常。前端
只要你本身可以开发、而且以为开发体验 ok,那么你这个配置就是靠谱的。vue
这篇文章主要是以我本身搭建 vue + webpack 的开发为例子,记录本身从 0 搭建时的思路和遇到的坑。node
因此可能不会对于配置的细节,作太详细的说明webpack
那么,重点说明的是思路和一些注意点git
下面是咱们要配置的功能,也会体现从 0 搭建项目的思路和注意点。es6
3.处理静态资源的插件和 loadergithub
5.代码规范约束配置web
从零搭建,就是从空文件夹开始嘛。那么首先
mkdir webpack4-project cd webpack4-project npm init
初始化项目后,下一步作什么呢?
想一想,咱们既然要配置 vue webpack 的前端开发环境
那确定要下载 webpack 、vue 吧,浏览器没法处理 vue 文件,那确定须要 vue-loader 吧
不用担忧本身作的对不对,反正作错了,终端确定会告诉你了,因此必定要本身动手
npm i webpack vue vue-loader --save-dev
npm i css-loader vue-template-compiler --save-dev
下载以后,就能够去写 webpack 配置了。
{ test: /\.vue$/, use: 'vue-loader' }
按照要求配置 css-loader ;
VueLoaderPlugin 是 vue-loader 内置的插件,直接在 plugins 配置就好 (这个是 vue-loader@15 的变化)
可是没有 devServer,目前咱们还看不到效果,接下来是开发服务器配置
使用 devServer 须要安装 webpack-dev-server
安装后,就能够去配置 devServer,devServer 能够有不少参数,
可是目前能够不用关注。由于 webpack4 是有默认配置的。
由于一个项目在开发和生产环境下,有不一样的需求。因此天然要有一个变量用来区分环境。
webpack3 的作法是在 package.json 的 script 字段配置 NODE_ENV
相似这样
"scripts": { "build": "NODE_ENV=production webpack --config webpack.config.js", "dev": "NODE_ENV=development webpack-dev-server --config webpack.config.js" },
这样配置后,
当运行 npm run dev 时,在 webpack.config.js 里经过 process.env.NODE_ENV 能够取到值 development
以 process.env.NODE_ENV 来作 if 判断就能够啦。
那么 webpack4 中,依旧能够这样作。也能够经过 mode 来指定环境。也是设置 process.env.NODE_ENV 的值
webpack3 中通常会设置 DefinePlugin,可是 webpack4 自动帮你设置该插件
它可让其余第三方类库或者你本身的 vue 代码中取到 process.env.NODE_ENV,在业务中判断环境。
new webpack.DefinePlugin({ 'process.env': { NODE_ENV: isDev ? '"development"' : '"production"' // 由于这个插件直接执行文本替换,给定的值必须包含字符串自己内的实际引号 } }),
devServer: { host: '0.0.0.0', // IP地址 port: 8888, // 端口号 hot: true, // 开启热更新 overlay: true, // 开启报错提示显示在浏览器遮罩层 historyApiFallback: true // 设置vue-router的模式是histroy },
其中热更新在 webpack3 中须要配置插件,webpack4 依旧能够这样写。可是已是默认配置了。
plugins: [new webpack.HotModuleReplacementPlugin()];
如今运行 npm run dev 已经能够跑起来服务,可是没有 index.html
前者是项目本地的 webpack,后者是全局的 webpack
style-loader:将css以style标签的形式插入到html中 css-loader: 能在js引入css依靠的就是css-loader解析
配置时,注意 style-loader css-loader stylus-loader 的顺序
webpack 的解析顺序是从右向左的。
处理图片须要 url-loader,而 url-loader 依赖 file-loader,因此都须要下载
另外 url-loader 还能够处理字体、视频文件
{ test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, use: [ { loader: 'url-loader', options: { limit: 10000, // 小于10000kb自动转base64 name: 'static/images/[name].[hash:7].[ext]' } } ] }, { test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: 'static/images/[name].[hash:7].[ext]' } }, { test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: 'static/images/[name].[hash:7].[ext]' } },
处理es6的语法,须要babel
babel-preset-env
babel-preset-env: 能够babel须要兼容哪些浏览器。好比全部浏览器的最后2个版本。 babel-preset-env 是依据 Can i use 和 browserslist 来判断某一个 JS 语法是否须要用 babel 编译 可是babel-preset-env只能编译ES6中JS的语法,没法编译ES6中的api 好比let / const 会被编译 为var 可是Array.include() Array.from() new Set()没法被编译
babel-polyfill和babel-transform-runtime-plugin
babel-polyfill是全局垫片,目的是提供一个完整的ES6环境,用于app,会污染全局变量,体积更大 babel-transform-runtime-plugin是局部垫片,主要用于开发库,不会污染全局变量,体积更小。
结论就是通常作业务开发就 babel-preset-env + babel-polyfill 就能够。
文档资料
实践过程当中,查阅过的文档留在这里。若是 API 忘记或者变化了,方便查阅。
https://babeljs.io/
关于@babel/preset-env的一篇文章,解释useBuiltIns的三个选项
https://www.jianshu.com/p/0dc...
安装postcss-loader / autoprefixer
配置loader后,还须要建立postcss.config.js做为配置文件
module: { rules: [ { test: /\.styl(us)?$/, loader: [ 'vue-style-loader', 'css-loader', 'postcss-loader', 'stylus-loader' ] } ] },
postcss.config.js
module.exports = { plugins: [ require('autoprefixer') ] }
参考vue-loader@15就能够
https://vue-loader.vuejs.org/...
简单说就是在css-loader里增长一个配置项 module:true
这里要注意,若是你是有的vue文件用css module,有的不用的话。
须要参考文档中的【可选用法】,用oneOf来配置
若是不指定devtool,你会发现代码调试起来十分不便,出错的行数也看不出来。
devtool: 'cheap-module-eval-source-map', // webpack4在开发阶段能够不写devtool
devtool的配置我没详细研究,我是开发阶段用cheap-module-eval-source-map,生产阶段去掉devtool
slint的配置,我用的stardard风格的,
官方文档地址 : https://github.com/standard/e...
须要依赖比较多的插件
npm i --save-dev eslint
npm install --save-dev eslint-config-standard eslint-plugin-standard eslint-plugin-promise eslint-plugin-import eslint-plugin-node
配置eslint可能遇到的问题:
"scripts": { "lint": "eslint --ext .js --ext .vue src/ build", "lint-fix": "eslint --fix --ext .js --ext .vue src/ build", "precommit": "npm run lint" },
分享一下.editorconfi的配置,用来统一编辑器风格的
root = true [*] charset = utf-8 end_of_line = lf indent_size = 2 indent_style = space insert_final_newline = true trim_trailing_whitespace = true
resolve: { extensions: ['.js', '.vue', '.json'], alias: { vue$: 'vue/dist/vue.esm.js', '@src': path.resolve(__dirname, '../src') } },
别名的设置可能遇到的坑是,在html里可使用别名@src
可是在css是没法识别别名。解决方案是使用 ~@src,或者在css-loader的配置项里再次设置别名
这个是优打包出来的终端界面的一个插件
https://www.jianshu.com/p/46b...
https://github.com/Formidable...
使用时,须要注意的的坑是,须要配置script脚本命令
package.json配置方法像这样,其余的参考文档就能够了,像普通插件同样使用就好
"scripts": { "build": "NODE_ENV=production webpack-dashboard -- webpack --config build/webpack.prod.conf.js", "dev": "NODE_ENV=development webpack-dashboard -- webpack-dev-server --config build/webpack.dev.conf.js", },