webpack基础知识
1.环境配置
全局安装
node install webpack webpack-cli -g
本地安装,指定版本,使用3.6.0时不需要安装webpack-cli
node install webpack@3.6.0 --save-dev
2.webpack起步
编写main.js
1 | //main.js引用到其它模块时,webpack打包时会自动引入 |
打包命令
npx webpack ./src/main.js -o ./dist/bundle.js --mode development
(默认使用的是全局安装的webpack进行打包)
表示把当前目录下的src/main.js作为入口进行打包,结果为当前目录下/dist/bundle.js,以开发的模式(代码不压缩,便于调试)
编写index.html
在index.html中引入bundle.js
1 |
|
3.webpack配置
初始化
1 | 初始化当前文件夹,会生成package.json用以版本控制 |
编写webpack的配置文件webpack.config.js
1 | const path = require('path') |
有了配置文件后,就可以在终端输入命令webpack
来代替npx webpack ./src/main.js -o ./dist/bundle.js --mode development
,值得注意的是,此处使用的webpack仍旧是全局的
package.json中添加一个script脚本
可以在package.json中添加一个script脚本,用脚本代替输入webpack命令
1 | "scripts": { |
之后便可使用nmp run build
命令执行打包操作,区别就是使用脚本的方式,会优先使用本地版本的webpack,而webpack命令则直接使用全局webpack**,终端输入的命令都是默认全局**
一般为了控制版本,开发都是使用本地的webpack,因此可以用
npm install webpack@3.6.0 –save-dev
不加@3.6.0则使用默认的最新版本,–save-dev表示运行时依赖,可用-D简写
4.webpack-loader
在我们之前的实例中,我们主要是用webpack来处理我们写的js代码,并且webpack会自动处理js之间相关的依赖。
但是,在开发中我们也需要加载css、图片,也包括一些高级的将ES6转成ES5代码,将TypeScript转成ES5代码,将scss、less转成css,将.jsx、.vue文件转成js文件等等。
对于webpack本身的能力来说,对于这些转化是不支持的。因此需要安装配置对应的loader才可使用。
一般的loader安装步骤为:
- 从官网查询,通过npm安装需要使用的loader
- 在webpack.config.js中的modules关键字下进行配置
例如下方
4.1css-loader处理css
安装对应的loader
npm install --save-dev css-loader@2.0.2 style-loader@0.23.1
指定版本是为了和webpack@3.6.0进行兼容,后文的所有模块指定版本均为如此
在webpack.config.js中配置module相关信息
1 | module:{ |
4.2less-loader处理less
less-loader负责处理less文件,less可编译成css文件
安装对应的loader
npm install --save-dev less-loader@4.1.0 less@3.9.0
less-loader负责把less文件加载成css文件,less是负责编译less代码的工具
在webpack.config.js中配置module相关信息
1 | module:{ |
4.3url-loader处理图片
当打包图片资源时需要引入的url-loader,url-loader需要依赖file-loader
npm install --save-dev url-loader@1.1.2
npm install --save-dev file-loader@3.0.1
配置module相关信息
1 | module:{ |
但是,我们发现图片并没有显示出来,这是因为图片使用的路径不正确。默认情况下,webpack会将生成的基于项目的路径直接返回给使用者。但是,我们整个程序是打包在dist文件夹下的,所以这里我们需要修改一下配置文件中的output。**(后文会介绍更优的方法)**
1 | output: { |
4.4babel-loader处理es6
由于我们的使用es6规范进行编码,而部分浏览器只支持es5的语法格式,因此需要配置对应的loader实现es6转es5
1 | npm install --save-dev babel-loader@7.1.5 babel-core@6.26.3 babel-preset-es2015@6.24.1 |
配置module相关信息
1 | module:{ |
当在main.js中使用了es6语法,或者是引入了其它css,less,jpg等文件,例如require(‘./css/normal.css’),对应的loader会进行转换处理,便于webpack打包
5.webpack配置vue
5.1起步
当需要在项目中使用vue进行开发时,webpack默认支持处理vue文件,需要进行配置。
安装
1 | npm install vue@2.5.21 --save # 为了兼容版本我们使用vue@2.5.21版本。 |
使用
index.html
1 |
|
main.js
1 | import Vue from 'vue' |
这样之后发现报如下错误:
bundle.js:1447 [Vue warn]:
You are using the runtime-only build of Vue where the template compiler is not available.
Either pre-compile the templates into render functions, or use the compiler-included build.原因:
runtime-only :代码中不可以有任何的template。runtime-compiler:代码中可以有template,因为有compiler 可以用于编译template。在html中使用的div 就是vue实例的template。所以会报错。
解决方案:把runtime-only改成runtime-compile,在webpack.config.js中配置
1 | module.exports = { |
重新打包即可在webpack中使用vue
正常运行之后,我们来考虑另外一个问题:
如果我们希望将data中的数据显示在界面中,就必须修改index.html。
如果我们后面自定义了组件,也必须修改index.html来使用组件。
但是html模板在之后的开发中,我并不希望手动的来频繁修改,
当el和template共存时,template会替换el模块的html代码
因此可通过修改template实现间接的修改div#app
例如:
index.html中
1 | <div id="app"> |
main.js中
1 | const myVue = new Vue({ |
标记#app的div标签会被替换为vue实例中的template
5.2使用vue文件解耦
虽然实现了html页面和vue的解耦,但是vue中的耦合了template和data和methods等,不易于开发,可以通过新建一个.vue文件把他们进行解耦。
例如:
app.vue文件
1 | <!--编写html代码,template --> |
main.js
1 | import app from "./vue/app"; |
index.html
1 | <div id="app2"> |
抽取出.vue文件后,webpack无法识别打包,因此需要安装并配置对应的Loader
npm install vue-loader vue-template-compiler --save-dev
配置vue-loader版本大于15时,需要配置一个VueLoaderPlugin,并且注意vue-template-compiler和vue的版本需要一致。
1 | const VueLoaderPlugin = require('vue-loader/lib/plugin');//用于vue-loader使用插件 |
5.3vue组件相互调用
当你想引用其它组件时,如下:
app.vue文件
1 | <template> |
main.js
1 | import app from "./vue/app"; |
index.html
1 | <div id="app2"> |
在js引入文件时,一般需要加上后缀名,例如import app from “./vue/app.vue”;
有时候我们不想写文件的后缀名,可以进行如下配置
1 | module.exports = { |
6.webpack-plugin
plugin,顾名思义是对webpack功能的扩展插件
于loader类型,需要安装并且在webpack.config.js中进行配置
BannerPlugin
属于webpack自带的插件,不需要安装用于为打包的文件添加版权声明
使用如下
1 | const webpack = require('webpack') //使用webpack自带的banner插件 |
html-webpack-plugin
考虑一个问题:目前,我们的index.html文件是存放在项目的根目录下的。
在真实发布项目时,发布的是dist文件夹中的内容,但是dist文件夹中如果没有index.html文件,那么打包的js等文件也就没有意义了。
所以,我们需要将index.html文件打包到dist文件夹中,这个时候就可以使用HtmlWebpackPlugin插件
安装html-webpack-plugin的作用
自动生成一个空的index.html文件到dist中(可以指定模板来生成)
将打包的js文件,自动通过script标签插入到body中
使用如下
安装
npm install html-webpack-plugin@3.2.0 --save-dev
在配置文件中引入插件,使用插件
1 | const HtmlWebpackPlugin = require('html-webpack-plugin'); |
当我们需要生成的index.html代码需要有一定代码时,就需要指定模板
一般需要指定一个html作为模板去生成index.html,便于加载vue相关代码
只需在配置文件中更改为:
new HtmlWebpackPlugin({
template: “index.html”,
}),模板中的script可不添加,会自动引入
uglifyjs-webpack-plugin
npm install uglifyjs-webpack-plugin@1.1.1 --save-dev
使用uglify压缩代码
版本号指定1.1.1,和后面要使用CLI2保持一致,便于兼容
注意,在webpack4之后,只要我们将生产模式设置为生产环境, mode: ‘production’ 它就会自动压缩js代码。
1 | const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin') |
7.webpack-dev-server
webpack提供了一个可选的本地开发服务器webpack-dev-server,
这个本地服务器基于node.js搭建,内部使用express框架,
可以实现我们想要的让浏览器自动刷新显示我们修改后的结果。
步骤:
- npm install –save-dev webpack-dev-server@2.9.1
安装的版本是需要与webpack以及vue脚手架对应的,此处指定2.9.1- 在配置文件中进行如下配置
devServer: {contentBase: resolve(__dirname,’dist’),//为哪个文件夹提供本地服务,默认是根目录
},inline: true, //页面实时刷新 port:8080,//端口号,默认8080
- 添加一个脚本命令,运行本地服务器,因为web-dev-server是本地安装的,因此不可直接在命令行使用命令
–open表示自动通过浏览器打开
“scripts”: {
“dev”: “webpack-dev-server –open”
},
注意:当手动ctrl +s时,服务器会自动编译,当开发软件失去焦点后也会自动编译
webpack.config.js
1 | const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin') |
1 | "scripts": { |
之后便可使用命令npm run dev
开启本地服务器
注:笔记根据B站视频学习整理