vue(5)-- webpack
这篇文章主要介绍了webpack
使用的一个小demo,来学习如何利用webpack
构建项目,以及打包js
文件,通过安装loader模块打包css
,less
,sass
等文件。
1. nrm
(牛肉面)的安装使用
作用:提供了一些最常用的NPM包镜像地址,能够让我们快速的切换安装包时候的服务器地址;
什么是镜像:原来包刚一开始是只存在于国外的NPM服务器,但是由于网络原因,经常访问不到,这时候,我们可以在国内,创建一个和官网完全一样的NPM服务器,只不过,数据都是从人家那里拿过来的,除此之外,使用方式完全一样;
- 运行
npm i nrm -g
全局安装nrm
包; - 使用
nrm ls
查看当前所有可用的镜像源地址以及当前所使用的镜像源地址; - 使用
nrm use npm
或nrm use taobao
切换不同的镜像源地址;
注意: nrm 只是单纯的提供了几个常用的 下载包的 URL地址,并能够让我们在 这几个 地址之间,很方便的进行切换,但是,我们每次装包的时候,使用的 装包工具,都是 npm
2. webpack认识
2.1 常见的网页静态资源
1
2
3
4
5
6
7
8
9
101. JS资源
- .js .jsx .coffee .ts(TypeScript 类 C# 语言)
2. CSS资源
- .css .less .sass .scss
3. Images资源
- .jpg .png .gif .bmp .svg
4. 字体文件(Fonts)资源
- .svg .ttf .eot .woff .woff2
5. 模板文件资源
- .ejs .jade .vue【webpack中定义组件的方式,推荐】2.2 网页中引入静态资源后出现问题以及解决方法
1
2
3
4
5
6
7
8
9
10
11
12
13引入静态资源后出现问题?
1. 因为要发起很多的二次请求导致网页加载速度慢
2. 要处理错综复杂的依赖关系
解决方法:
1. 合并、压缩、精灵图、图片的Base64编码
2. 可以使用之前学过的requireJS、也可以使用webpack解决各个包之间的复杂依赖关系;
使用Gulp和webpack的区别:
a. Gulp是基于 task 任务的;
b. Webpack是基于整个项目进行构建的;
- 借助于webpack这个前端自动化构建工具,可以完美实现资源的合并、打包、压缩、混淆等诸多功能。
- [webpack官网](https://webpack.github.io/)2.3 什么是
webpack
?webpack
是前端项目构建工具,她是基于node.js
开发出来的
3. 使用webpack
构建隔行变色的小demo
3.1 安装
webpack
1
2
3
4
5
61.全局安装 npm i webpack -g
默认安装最新版@4.28.1 由于webpack版本兼容问题,降低安装版本解决问题
npm i webpack@3.8.1 -g
2.在项目根目录中运行下面命令安装到项目依赖中,否则无法使用webpack-dev-server
npm i webpack@3.8.1 --save-dev3.2 初始化项目,使用npm管理项目中的依赖包
1
npm init -y
3.3 创建项目基本目录结构
1
2
3
4
5
6
7
8
9
10
11├─dist 最终要发布的版本文件夹
├─src 开发中要用到的静态资源
├──css css样式、less、sass等
├──js js文件
├──images 图片资源
├──index.html 首页
└──main.js 项目入口
├─node_modules 第三方包(生成)
├─package.json 包的描述文件(生成)
├─package-lock.json 第三方包版本锁定文件(生成,npm5+才有)
└─webpack.config.js webpack配置文件3.4 在项目中安装
jquery
1
npm i jquery -D
3.5 创建main.js
1
2
3
4
5
6
7// 导入jquery类库
import $ from 'jquery'
// 设置偶数行背景色,索引从0开始
$('li:even').css('backgroundColor','cyan');
// 设置奇数行背景色
$('li:odd').css('backgroundColor','gray');直接在页面上引用
main.js
会报错,因为浏览器不认识import
这种高级的es6
语法,需要使用webpack
进行处理,webpack
默认会把这种高级的语法转换为低级的浏览器能识别的语法。命令行运行下面命令对
main.js
进行打包处理:1
2webpack 入口文件路径 输出文件路径
webpack src/js/main.js dist/bundle.js运行完成后,在
index.html
中引入bundle.js
在浏览器中打开就可以实现隔行变色效果了。
4. 基于隔行变色demo使用webpack
的配置文件简化打包过程
4.1 在项目根目录中创建
webpack.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18// 运行webpack命令时需要指定入口文件和输出文件的路径,我们在webpack.config.js中配置这两个路径
// 导入处理路径的模块
var path = require('path');
var config = {
entry: path.resolve(__dirname, 'src/js/main.js'), // 项目入口文件
output: { // 配置输出选项
path: path.resolve(__dirname, 'dist'), // 配置输出的路径
filename: 'bundle.js' // 配置输出的文件名
}
}
// 导出一个配置对象,将来webpack在启动的时候,会默认来查找webpack.config.js,并读取这个文件中导出的配置对象,来进行打包处理
module.exports = config;
// 当我们在 控制台,直接输入 webpack 命令执行的时候,webpack 做了以下几步:
// 1. 首先,webpack 发现,我们并没有通过命令的形式,给它指定入口和出口
// 2. webpack 就会去 项目的 根目录中,查找一个叫做 `webpack.config.js` 的配置文件
// 3. 当找到配置文件后,webpack 会去解析执行这个 配置文件,当解析执行完配置文件后,就得到了 配置文件中,导出的配置对象
// 4. 当 webpack 拿到 配置对象后,就拿到了 配置对象中,指定的 入口 和 出口,然后进行打包构建;配置好
webpack.config.js
文件后,在命令行中输入webpack
回车就能实现打包了,每次修改代码之后运行webpack
命令进行打包处理,然后到页面刷新看见修改后的变化。4.2 使用
webpack-dev-server
这个工具来实现自动打包编译的功能1
2
3
4
5
6
7
8安装webpack-dev-server 指定版本
npm i webpack-dev-server@2.9.3 -D
安装完毕后,这个工具的用法和 webpack 命令的用法完全一样
由于在项目中本地安装的webpack-dev-server所以无法把它当作 脚本命令 在命令行(powershell)中直接运行
只有那些安装到全局 -g 的工具,才能在 终端中正常执行
注意: webpack-dev-server 这个工具,如果想要正常运行,要求在本地项目中,必须安装 webpack,这就是为什在开始已经全局安装webpack的时候还要进行一次项目安装 npm i webpack@3.8.1 --save-dev
webpack-dev-server 帮我们打包生成的 bundle.js 文件,并没有存放到 实际的 物理磁盘上;而是直接托管到了电脑的内存中,所以我们在项目根目录中根本找不到这个打包好的 bundle.js;
我们可以认为 webpack-dev-server 把打包好的文件,以一种虚拟的形式托管到了项目的根目录中,虽然我们看不到它,但是可以认为, 和 dist src node_modules 是平级,有一个看不见的文件,叫做 bundle.js安装完成后在命令行直接运行
webpack-dev-server
进行打包,发现报错,此时需要借助package.json
文件中的指令来运行webpack-dev-server
命令,在scripts
节点下新增"dev": "webpack-dev-server"
指令,发现可以进行实时打包,但是dist目录下并没有生成bundle.js
文件,这是因为webpack-dev-server
将打包好的文件放在了内存中。1
2
3"scripts": {
"dev": "webpack-dev-server"
}1
2# 命令行中运行
npm run dev把
bundle.js
放在内存中的好处是:由于需要实时打包编译,所以放在内存中速度会非常快,这个时候访问webpack-dev-server
启动的http://localhost:8080/
网站,发现是一个文件夹的面板,需要点击到src
目录下,才能打开我们的index首页
,此时引用不到bundle.js
文件,需要修改index.html
中script的src
属性为:1
<script src="../bundle.js"></script>
为了能在访问
http://localhost:8080/
的时候直接访问到index首页,可以使用--contentBase src
指令来修改dev
指令,指定启动的根目录:1
"dev": "webpack-dev-server --contentBase src"
同时修改index页面中script的
src
属性为1
<script src="/bundle.js"></script>
4.3 使用
html-webpack-plugin
插件配置启动页面由于使用
--contentBase
指令的过程比较繁琐,需要指定启动的目录,同时还需要修改index.html
中script标签的src
属性,所以推荐大家使用html-webpack-plugin
插件配置启动页面a. 运行
npm i html-webpack-plugin@2.30.1 --save-dev
安装到开发依赖1
npm i html-webpack-plugin@2.30.1 --save-dev
b. 修改
webpack.config.js
配置文件如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19// 导入处理路径的模块
var path = require('path');
// 导入自动生成HTMl文件的插件
var htmlWebpackPlugin = require('html-webpack-plugin');
var config = {
entry: path.resolve(__dirname, 'src/js/main.js'), // 项目入口文件
output: { // 配置输出选项
path: path.resolve(__dirname, 'dist'), // 配置输出的路径
filename: 'bundle.js' // 配置输出的文件名
},
plugins:[ // 添加plugins节点配置插件
new htmlWebpackPlugin({
template:path.resolve(__dirname, 'src/index.html'),//模板路径
filename:'index.html'//自动生成的HTML文件的名称
})
]
};
module.exports = config;c. 修改
package.json
中script
节点中的dev
指令如下:1
"dev": "webpack-dev-server"
d. 将
index.html
中script标签注释掉,因为html-webpack-plugin
插件会自动把bundle.js
注入到index.html
页面中!
5. 基于上面的demo实现自动打开浏览器、热更新和配置浏览器的默认端口号
方法一:
修改
package.json
的script节点如下,其中--open
表示自动打开浏览器,--port 3000
表示打开的端口号为3000,--hot
表示启用浏览器热更新。1
"dev": "webpack-dev-server --hot --port 3000 --open"
方法二:
a. 修改
webpack.config.js
文件,新增devServer
节点如下:1
2
3
4
5
6devServer:{
open: true, // 自动打开浏览器
port: 3000, // 设置启动时候的运行端口
contentBase: 'src', // 指定托管的根目录
hot: true // 启用热更新 第1步
}b. 在头部引入
webpack
模块:1
2// 启用热更新 第2步 引入webpack包
var webpack = require('webpack');c. 在
plugins
节点下新增:1
2
3plugins: [ // 配置插件节点
new webpack.HotModuleReplacementPlugin(), // new 一个热更新模块对象,这是启用热更新 第 3 步
]
6. 使用webpack
打包css
,less
,sass
文件
打包
css
文件a. 安装loader模块
1
npm i style-loader@0.19.0 css-loader@0.28.7 --save-dev
b. 修改
webpack.config.js
这个配置文件:1
2
3
4
5
6
7module: { // 用来配置第三方loader模块的
rules: [ // 文件的匹配规则
{ test: /\.css$/, use: ['style-loader', 'css-loader'] }//处理css文件的规则
]
}
// 注意:`use`表示使用哪些模块来处理`test`所匹配到的文件
// `use`中相关loader模块的调用顺序是从后向前调用的打包
less
文件a. 安装loader模块
1
npm i less-loader@4.0.5 less@2.7.3 -D
b. 修改
webpack.config.js
这个配置文件,在rules中添加:1
{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] }
打包
sass
文件a. 安装loader模块
1
npm i sass-loader@6.0.6 node-sass@4.5.3 --save-dev
b. 修改
webpack.config.js
这个配置文件,在rules中添加:1
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] }
c. 备注:安装node-sass时如果安装不成功,可在通过下面网址提供的方法本地安装
1
https://www.cnblogs.com/codebook/p/10274990.html
7. 备注:隔行变色demo文件
main.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// main.js是项目入口文件
// 导入jquery -- import ** from ** 是es6的语法导入模块方式
import $ from 'jquery';
// 利用 import 语法 导入样式表
import './css/index.css';
import './css/index.less';
import './css/index.scss';
$(function (){
$('li:odd').css('backgroundColor', 'cyan');
$('li:even').css('backgroundColor', function (){
return '#' + 'ddd'
})
});webpack.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39const path = require('path');
const webpack = require('webpack');
// 导入 在内存中生成 HTML 页面的 插件
const htmlWebpackPlugin = require('html-webpack-plugin');
// 这个js配置文件,通过node中的模块操作,向外暴露一个配置对象
const config = {
// 入口,表示webpack要打包哪个文件
entry: path.join(__dirname, './src/main.js'),
// 出口相关配置
output: {
path: path.join(__dirname, './dist'), // 指定打包好的文件输出到哪个路径
filename: 'bundle.js' // 指定输出文件名称
},
devServer: { // 这是配置 dev-server 命令参数的第二种形式,这种方式相对麻烦一些,也是在命令行使用 npm run dev 执行
//推荐在package.json中使用命令 --open --port 3000 --contentBase src --hot
open: true, // 自动打开浏览器
port: 3000, // 设置启动时候的运行端口
contentBase: 'src', // 指定托管的根目录
hot: true // 启用热更新 第1步
},
plugins: [ // 配置插件节点
new webpack.HotModuleReplacementPlugin(), // new 一个热更新模块对象,这是启用热更新 第 3 步
new htmlWebpackPlugin({ // 创建一个在内存中 生成 HTML 页面的插件
template: path.join(__dirname, './src/index.html'), // 指定模板页面,将来会根据指定的页面路径,去生成内存中的页面
filename: 'index.html' // 指定生成的页面的名称
})
],
module: { // 匹配所有第三方模块加载器
rules: [ // 所有第三方模块 匹配规则
{ test: /\.css$/, use: ['style-loader', 'css-loader'] },
{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] },
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] }
]
}
};
module.exports = config;package.json
( 注意:json文件中不能有注释 )1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28{
"name": "webpack-demo",
"version": "1.0.0",
"description": "",
"main": "webpack.config.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev2": "webpack-dev-server --open --port 3000 --contentBase src --hot",
"dev": "webpack-dev-server"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"css-loader": "^0.28.7",
"html-webpack-plugin": "^2.30.1",
"less": "^2.7.3",
"less-loader": "^4.0.5",
"node-sass": "^4.11.0",
"sass-loader": "^6.0.6",
"style-loader": "^0.19.0",
"webpack": "^3.8.1",
"webpack-dev-server": "^2.9.3"
},
"dependencies": {
"jquery": "^3.3.1"
}
}