webpack是前端的一个项目构建工具,它是基于Node.js开发出来的一个前端工具,他可以解决多个包之间的复杂依赖关系
npm i webpack -g //全局安装
npm i webpack -D //项目中安装
实现隔行变色
<ul>
<li>这是第1个lili>
<li>这是第2个lili>
<li>这是第3个lili>
<li>这是第4个lili>
<li>这是第5个lili>
<li>这是第6个lili>
<li>这是第7个lili>
<li>这是第8个lili>
<li>这是第9个lili>
<li>这是第10个lili>
ul>
npm init
初始化项目,使用npm管理项目中的依赖包cnpm i jquery --save
安装jquery类库main.js
并书写各行变色的代码逻辑: // 导入jquery类库
import $ from 'jquery' //ES6导入模块方式
//const $=require('jquery') Node导入方式
// 设置偶数行背景色,索引从0开始,0是偶数
$('#list li:even').css('backgroundColor','lightblue');
// 设置奇数行背景色
$('#list li:odd').css('backgroundColor','pink');
main.js
会报错,因为浏览器不认识import
这种高级的JS语法,需要使用webpack进行处理,webpack默认会把这种高级的语法转换为低级的浏览器能识别的语法;webpack 要打包的文件路径 输出文件路径
对main.js
进行处理:webpack src/js/main.js dist/bundle.js
<script src="../dist/bundle.js">script>
从以上案例,我们可以获得webpack的作用
每当我们在main.js中做出修改时,我们总要运行webpack 要打包的文件路径 输出文件路径
命令来打包文件,命令比较长,我们可以选择简化命令
webpack.config.js
webpack.config.js
中配置这两个路径: // 导入处理路径的模块
var path = require('path');
// 导出一个配置对象,将来webpack在启动的时候,会默认来查找webpack.config.js,并读取这个文件中导出的配置对象,来进行打包处理
module.exports = {
entry: path.join(__dirname, './src/js/main.js'), // 项目入口文件
output: { // 配置输出选项
path: path.join(__dirname, './dist'), // 配置输出的路径
filename: 'bundle.js' // 配置输出的文件名
}
}
webpack
每次修改后都需要运行webpack命令比较麻烦。所以使用webpack-dev-server
来实现代码实时打包编译,当修改代码之后,会自动进行打包构建。
cnpm i webpack-dev-server -D
安装到开发依赖webpack-dev-server
来进行打包,发现报错,要想正常运行,须在本地项目中安装webpackpackage.json
文件中的指令,来进行运行webpack-dev-server
命令,在scripts
节点下新增"dev": "webpack-dev-server"
指令,发现可以进行实时打包,但是dist目录下并没有生成bundle.js
文件,这是因为webpack-dev-server
将打包好的文件放在了内存中bundle.js
放在内存中的好处是:由于需要实时打包编译,所以放在内存中速度会非常快http://localhost:8080/
网站,发现是一个文件夹的面板,需要点击到src目录下,才能打开我们的index首页,此时引用不到bundle.js文件,需要修改index.html中script的src属性为:
http://localhost:8080/
的时候直接访问到index首页,可以使用--contentBase src
指令来修改dev指令,指定启动的根目录:"dev": "webpack-dev-server --contentBase src"
同时修改index页面中script的src属性为
--open
--port 3000
--contentBase src
--hot
方式一:
"dev": "webpack-dev-server --contentBase src --open --port 3000 --hot"
方式二:
在webpack.config.js中
// 导入处理路径的模块
var path = require('path');
var webpack = require('webpack');
module.exports = {
entry: path.join(__dirname, 'src/js/main.js'), // 项目入口文件
output: { // 配置输出选项
path: path.join(__dirname, 'dist'), // 配置输出的路径
filename: 'bundle.js' // 配置输出的文件名
},
devServer:{
hot:true,
open:true,
port:4321,
contentBase:'src'
},
plugins:[
//new一个热更新模块对象
new webpack.HotModuleReplacementPlugin()
]
}
由于使用--contentBase
指令的过程比较繁琐,需要指定启动的目录,同时还需要修改index.html中script标签的src属性,所以我们使用html-webpack-plugin
插件配置启动页面.
cnpm i html-webpack-plugin --save-dev
安装到开发依赖webpack.config.js
配置文件如下: // 导入处理路径的模块
var path = require('path');
// 导入自动生成HTMl文件的插件
var htmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: path.resolve(__dirname, 'src/js/main.js'), // 项目入口文件
output: { // 配置输出选项
path: path.resolve(__dirname, 'dist'), // 配置输出的路径
filename: 'bundle.js' // 配置输出的文件名
},
plugins:[ // 添加plugins节点配置插件
new htmlWebpackPlugin({
template:path.join(__dirname, 'src/index.html'),//模板路径
filename:'index.html'//自动生成的HTML文件的名称
})
]
}
package.json
中script
节点中的dev指令如下(去掉contentBase):"dev": "webpack-dev-server"
html-webpack-plugin
插件会自动把bundle.js注入到index.html页面中!作用:
自动 在内存中根据指定页面生成一个内存页面
自动把打包好的bundle.js追加到页面中
webpack默认只能打包处理类型的文件,无法处理其他非JS类型文件,如果要处理,则需安装一些第三方loader
加载器
cnpm i style-loader css-loader -D
webpack.config.js
这个配置文件:module: { // 用来配置第三方loader模块的
rules: [ // 文件的匹配规则
{ test: /\.css$/, use: ['style-loader', 'css-loader'] }//处理css文件的规则
]
}
use
表示使用哪些模块来处理test
所匹配到的文件;use
中相关loader模块的调用顺序是从后向前调用的;import
cnpm i less-loader less -D
webpack.config.js
这个配置文件:{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] },
import
cnpm i sass-loader node-sass -D
webpack.config.js
中添加处理sass文件的loader模块:{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] }
import
默认webpack处理不了样式中的url
cnpm i url-loader file-loader -D
webpack.config.js
中添加loader模块:{ test: /\.(jpg|png|gif|bmp|jpeg)$/, use: 'url-loader' }
//file-loader是url-loader的内部依赖,在此处不必声明
base64
编码,我们可以通过limit
(单位是字节)指定进行base64编码的图片大小;只有小于指定字节(byte)的图片才会进行base64编码:{ test: /\.(jpg|png|gif|bmp|jpeg)$/, use: 'url-loader?limit=7632' }
{ test: /\.(jpg|png|gif|bmp|jpeg)$/, use: 'url-loader?limit=7632&name=[name].[ext]' }
hash
区分{ test: /\.(jpg|png|gif|bmp|jpeg)$/, use: 'url-loader?limit=7632&name=[hash:8]-[name].[ext]' }
//8个字节的hash值
cnpm i bootstrap -s
import 'bootstrap/dist/css/bootstrap.css'
注意: 如果要通过路径的形式,去引入 node_modules 中相关的文件,可以直接省略 路径前面的 node_modules这一层目录,直接写 包的名称,然后后面跟上具体的文件路径 不写 node_modules 这一层目录 ,默认 就会去node_modules 中查找
webpack.config.js
中添加loader模块:{ test: /\.(ttf|eot|svg|woff|woff2)$/, use: 'url-loader' }
//file-loader是url-loader的内部依赖,在此处不必声明
在webpack中,默认只能处理一部分ES6的新语法,一些更高级的或者ES7语法处理不了,需借助第三方loader,第三方的loader把高级语法转为低级语法之后交给webpack,打包到bundle.js中
例如在main.js中,以下代码就处理不了
class Person{
static info={name:'zs',age:20}
}
class 关键字,是ES6中提供的新语法,是用来实现ES6中面向对象编程的方式
使用 static 关键字,可以定义静态属性
所谓的静态属性,就是 可以直接通过 类名, 直接访问的属性
实例属性: 只能通过类的实例,来访问的属性,叫做实例属性
cnpm i babel-core babel-loader babel-plugin-transform-runtime -D
安装babel的相关loader包cnpm i babel-preset-env babel-preset-stage-0 -D
安装babel转换的语法webpack.config.js
中添加相关loader模块,其中需要注意的是,一定要把node_modules
文件夹添加到排除项:{ test: /\.js$/, use: 'babel-loader', exclude: /node_modules/ }
.babelrc
文件,并修改这个配置文件如下:{
"presets":["env", "stage-0"], //presets可译为语法
"plugins":["transform-runtime"]
}