你们好,本人名叫苏日俪格,如今不少的项目都使用了webpack,如今最火的也就是vue和webpack结合来完善一个项目,因为介入了一个有几年历史的产品,第一步不得不看看webpack的配置项,看看项目中的哪些部分被模块化了,由于想要更多的理解webpack,查找了一些资料看了不少教程和API,测试了一个没有使用vue脚手架的项目(ps:强烈建议新手务必远离vue-cli,这东西是给有不少年开发经验的老手来提升开发效率的,并不适合学习),下面我会把我对webpack的理解跟你们分享一下,本文纯属我的理解,有哪里不对的地方请在评论区指出,你们一块儿学习共同进步。javascript
听到webpack这个词,就会有不少人也包括我都会想到gulp,认为两者都是自动化构建工具;其实不是这样的,在这里我先介绍两者的异同:css
webpack特色html
- Webpack 有两种组织模块依赖的方式,同步和异步。异步依赖做为分割点,造成一个新的块。在优化了依赖树后,每个异步区块都做为一个文件被打包。
- Webpack 自己只能处理原生的 JavaScript 模块,可是 loader 转换器能够将各类类型的资源转换成 JavaScript 模块。这样,任何资源均可以成为 Webpack 能够处理的模块。
- Webpack 有一个智能解析器,几乎能够处理任何第三方库,不管它们的模块形式是 CommonJS、 AMD 仍是普通的 JS 文件。甚至在加载依赖的时候,容许使用动态表达式 require(“./templates/” + name + “.jade”)。
- Webpack 还有一个功能丰富的插件系统。大多数内容功能都是基于这个插件系统运行的,还能够开发和使用开源的 Webpack 插件,来知足各式各样的需求。
- Webpack 使用异步 I/O 和多级缓存提升运行效率,这使得 Webpack 可以以使人难以置信的速度快速增量编译。
在这里不得不说一下:
webpack、gulp和grunt都是在nodeJs的环境下运行的,而在中大型项目或产品中,nodeJs通常用作中间层,作数据处理和转发,而后再由底层语言进行底层开发,好比咱们公司的产品就是这种架构,C++做为底层系统的开发;vue
看了上面的内容,咱们虽然知道了它在项目中用到的好处,但是咱们没有见过,没有真凭实据,能够参考一下这个项目的demo(https://segmentfault.com/a/1190000012848772),一步一步让你的项目愈来愈快;那么webpack具体怎么用的呢?下面就来逐步介绍一下,为了你们能学到,我这里新建一个项目作示范:java
npm init
来初始化工程,一路回车下来会有一个package.json配置文件生成npm i vue
安装上vuenpm i webpack vue-loader -D
安装webpack和vue-loadernpm i style-loader css-loader url-loader file-loader vue-template-compiler -D
npm i webpack-cli -D
以上四步安装完是这个效果:node
app.vue文件:react
<template> <div id="app"></div> </template> <script type="text/javascript"> export default { } </script> <style> </style>
index.js文件:webpack
import Vue from 'vue'; import App from './app.vue'; import './assets/style/test.css'; var vm = new Vue({ el: '#app', render: (h) => h(App) // 经过建立DOM元素返回参数h将App挂载,h即为hyperscript,用来实现虚拟DOM的 });
webpack.config.js文件:git
const Path = require('path'); // 从node上导入path const VueLoaderPlugin = require('vue-loader/lib/plugin'); // webpack 4版本以后加的,以前的版本不须要这个 let config = { entry: Path.resolve(__dirname, './src/index.js'), // 以join拼接path的形式配置绝对路径,相对路径打包后找不到会报错 output: { filename: 'vendor.build.js', path: Path.join(__dirname, 'dist') }, module: { rules: [{ test: /\.vue$/, loader: 'vue-loader' }, { test: /\.css$/, use: [ 'style-loader', 'css-loader' ] }, { test: /\.(png|jpg|jpeg|gif)$/, use: { loader: 'url-loader', options: { limit: 1024, // 判断图片的大小 若是小于1024就会转换成base64 name: '[name].[ext]' // 输出图片的名字 ext是扩展名 } } }] }, plugins: [ new VueLoaderPlugin() ] }; module.exports = config;
上面配置好了以后还差最后一步,就是用webpack来执行配置跑项目,在scripts里面加上build:github
"build": "webpack --config webpack.config.js"
npm run build
来打包项目到dist下面的vendor.build.js:这个时候会看到咱们的项目中多了个dist,就是咱们打包好的项目,这一步就省去了咱们不少的http请求,达到更优化的效果。
在打包这一过程当中,若是出现了打包失败,检查完问题后再次打包,若是显示的是打包失败,那么请删了以前打的包,从新build就会好了
npm i webpack-dev-server
,再往scripts里面加上这个"dev": "webpack-dev-server --config webpack.config.js"
:咱们会看到有两个webpack.config.js,可是咱们如今安装的是咱们开发环境须要用到的,接下来增长一些开发模式须要用到的webpack的配置,这些配置我会逐步分析:
target: 'web',
放在全局的webpack的配置里面npm i cross-env
,在打包和运行以前都加上环境变量标识:"build": "cross-env NODE_ENV=production webpack --config webpack.config.js", "dev": "cross-env NODE_ENV=development webpack-dev-server --config webpack.config.js",
我的习惯:喜欢运行start,因此把run dev替换掉了:"start": "npm run dev"
效果以下:
首先用一个变量表明是开发环境:const isDev = process.env.NODE_ENV === 'development';
在package.json scripts里面设置的生产和开发环境的环境变量都存在于cross-dev,咱们设置脚本的时候启动的环境变量全都存在于process.env里面,这样咱们在以后能够随意调用它
而后在最下面给module.exports赋值以前,加个判断:
if (isDev) { config.devServer = { port: 8088, // webpack服务须要监听的端口号 host: '0.0.0.0', // 能够经过本机内网ip访问,这样别人也能够访问,手机也可访问,若是设置成localhost则否则 overlay: { errors: true // 这个无关紧要,webpack编译出现的错误会出如今网页中,便于更改 } }; }
上述代码中的配置项咱们在webpack官网中均可以看获得,每一步的缘由我已在后面加了相关注释。
const Webpack = require('webpack');
用法和以前的同样,全部的插件都是须要引入并建立实例这一过程;下面根据以前配置好的环境变量在webpack编译的过程当中,对写的js代码都会判断环境,根据不一样环境对代码进行打包(咱们只想要"development",因此外面会加上单引号),代码以下:
new Webpack.DefinePlugin({ 'process-env': { NODE_ENV: isDev ? '"development"' : '"production"' } })
webpack有个支持热加载功能的插件HotModuleReplacementPlugin,再经过vue-loader读取vue的组件,在devServer里面配置一个hot: true
,就造成了热加载;
还一个是映射工具devtool,使用source-map作映射,将咱们压缩文件中的代码映射回源文件中的原始位置的方法,更轻松调试,谷歌和火狐都已经支持,文件大效率低,致使webpack编译慢,而eval解析出来的会很乱,二合一是webpack提出来的有效的方法;
在CLI下的devServer下还有一个compress是用在全部服务端gzip 压缩,这个在Yahoo雅虎军规上有提到;
更多的好用的插件就去webpack官网了解吧
若是是本身建的html的小伙伴就能够在html-webpack-plugin里面配置它,以后再把带有id是app的div放进html里面,在app.vue里面渲染的dom就会生成在html中:
用完了这个webpack我感受棒极了,之后项目必备品!
参考☟☟☟:
https://blog.csdn.net/c_kite/article/details/71279853
http://www.javashuo.com/article/p-ndhculqd-gw.html
http://www.javashuo.com/article/p-bovvnnty-gt.html
webpack官网
**若是喜欢本文的话单击爱心加关注谢谢O(∩_∩)O~**
本文的全部内容均是一字一句敲上去的,但愿你们阅读完本文能够有所收获,由于能力有限,掌握的知识也是不够全面,欢迎你们提出来一块儿分享!谢谢O(∩_∩)O~
欢迎来个人GitHub,喜欢的能够star,项目随意fork,支持转载但要下标注,同时恭候:个人简书 Resume