webpack
概念:webpack 是前端项目工程化的具体解决方案(webpack 是基于 node.js 开发出来的打包工具)。
主要功能:它提供了友好的前端模块化开发支持,以及代码压缩混淆、处理浏览器端 JavaScript 的兼容性、性能优化等强大的功能。
webpack基本使用
- 新建项目目录,cmd进入该路径下,并运行 npm init –y 命令,生成 package.json文件
- 新建 src 目录
- 在 src目录下新建 index.html 和 index.js
- 初始化首页基本的结构
- cmd运行 npm install jquery –S 命令,安装 jQuery
- 通过 ES6 模块化的方式导入 jQuery,实现列表隔行变色效果
(ps:进入文件夹,全选文件路径,输入cmd回车,即可快速进入该路径下的cmd;另外cmd操作都是在该路径下)
主要代码:
//index.html
<body>
<ul>
<li>这是第 1 个 li</li>
<li>这是第 2 个 li</li>
<li>这是第 3 个 li</li>
<li>这是第 4 个 li</li>
<li>这是第 5 个 li</li>
<li>这是第 6 个 li</li>
<li>这是第 7 个 li</li>
<li>这是第 8 个 li</li>
<li>这是第 9 个 li</li>
</ul>
</body>
//index.js
// 导入 jQuery
import $ from 'jquery'
$(function () {
// 奇数行为红色
//偶数行为绿色
$('li:odd').css('background-color', 'red')
$('li:even').css('background-color', 'green')
})
(因为兼容性问题,页面显示不出效果,需要webpack处理)
-
在项目中安装 webpack
在cmd运行如下的命令,安装 webpack 相关的两个包:
npm install webpack@5.42.1 webpack-cli@4.9.0 -D
-
在项目中配置 webpack
(1)在项目根目录中,创建名为 webpack.config.js 的 webpack 配置文件,并初始化如下的基本配置:
module.exports = { mode: 'development', //development适合开发环境,打包速度快,不会对打包生成的文件进行代码压缩和性能优化 //production生产环境,会对打包生成的文件进行代码压缩和性能优化打包速度很慢,仅适合在项目发布阶段使用 }
(webpack.config.js 是 webpack 的配置文件。webpack 在真正开始打包构建之前,会先读取这个配置文件,从而基于给定的配置,对项目进行打包)
(2)在 package.json 的 scripts 节点下,新增 dev 脚本如下:
"scripts": {
"dev": "webpack"
},
(3)在终端中运行 npm run dev 命令,启动 webpack 进行项目的打包构建。(生成main.js文件)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-08sEZen9-1647137354890)(C:\Users\mi\AppData\Roaming\Typora\typora-user-images\image-20220307102152265.png)]
(4)最终目录和效果
-
在 webpack 4.x 和 5.x 中, 默认的打包入口文件为 src 目录下的index.js;默认的输出文件路径为 dist 路径下的 main.js。
-
可以自定义打包的入口与出口:在webpack.config.js 配置文件中,通过 entry 节点指定打包的入口。通过 output 节点指定打包的出口:
const path = require('path') module.exports = { mode: 'development', // entry:指定要处理哪个文件 entry:path.join(__dirname,'./src/index.js'),//可以修改js文件 // 指定生成文件存放到哪里 output: { path: path.join(__dirname,'dist'), //生成的文件名 filename:'bundle.js'//可以修改js文件名称 } }
-
补充:‘@’表示src源代码目录,不用使用…/从里往外查找;使用@需要配置:
//webpack.config.js中module.exports: resolve:{ alias:{ '@':path.join(__dirname, './src/') } }
webpack 中的插件
(1)webpack-dev-server
webpack-dev-server 可以让 webpack 监听项目源代码的变化,从而进行自动打包构建,每当修改了源代码,webpack 会自动进行项目的打包和构建
- 安装 webpack-dev-server
项目中安装此插件:
npm install webpack-dev-server@3.11.2 -D
-
配置 webpack-dev-server
1.修改 package.json 中scripts 中的 dev 命令:
"scripts": { "dev": "webpack serve" },
2.再次运行 npm run dev 命令,重新进行项目的打包
3.在浏览器中访问 http://localhost:8080 地址,查看自动打包效果
(ps:没有使用这个插件时,webpack 打包生成的文件,会存放到实际的物理磁盘上;配置了 webpack-dev-server 之后,打包生成的文件存放到了内存中)
4.生成到内存中的文件,默认放到了项目的根目录中,而且是虚拟的、不可见的。 直接用 / 表示项目根目录,后面跟上要访问的文件名称,即可访问;例如 /bundle.js 就表示要访问内存中的 bundle.js 文件
(2)html-webpack-plugin
html-webpack-plugin 插件,将 src 目录下的 index.html 首页,复制到项目根目录中一份。
-
安装 html-webpack-plugin
项目中安装此插件:
npm install html-webpack-plugin@5.3.2 -D
-
在webpack.config.js配置 html-webpack-plugin
// 导入html插件 const HtmlPlugin = require('html-webpack-plugin') // 创建html插件的实例对象 const htmlPlugin = new HtmlPlugin({ template: './src/index.html', //指定原文件的存放路径 filename: './index.html', //指定生成文件存放路径 }) module.exports = { plugins:[htmlPlugin], }
(重新npm run dev 访问http://localhost:8080/即可)
(3)devServer 节点
在 webpack.config.js 配置文件中, 对devServer 节点进行配置:
// 指定生成文件存放到哪里
output: {
path: path.join(__dirname,'dist'),
//生成的文件名
filename:'bundle.js'
},
plugins:[htmlPlugin],
devServer:{
open:true, //自动打开浏览器
host:'127.0.0.1', //实时打包所以的主机地址
port:80, //实时打包所有端口号,在http协议中,端口号是80可以被省略
}
webpack 中的 loader
- loader 概述
在实际开发中,webpack 默认只能打包处理以 .js 结尾的文件。其他文件webpack 默认处理不了,需要调用 loader 加载器才可以正常打包,否则会报错!
-
loader 加载器的作用:
协助 webpack 打包处理特定的文件模块。比如: css-loader 可以打包处理 .css 相关的文件; less-loader 可以打包处理 .less 相关的文件;babel-loader 可以打包处理 webpack 无法处理的高级 JS 语法
-
打包处理 css 文件 :
运行 npm i style-loader@3.0.0 css-loader@5.2.6 -D 命令,安装处理 css 文件的 loader ;在 webpack.config.js 的 module 的rules 数组中,添加 loader 如下:
module: { rules: [ {test: /\.css$/, use: ['style-loader','css-loader']} ] //test表示匹配的文件类型,use表示要调用的loader }
(use 数组中的 loader 顺序固定 ;多个 loader 的调用顺序是:从后往前调用)
-
打包处理 less 文件 :
运行 npm i less-loader@10.0.1 less@4.1.1 -D 命令 ;在 webpack.config.js 的 module 的rules 数组中,添加 loader 如下:
module: {
rules: [
{test: /\.less$/,use:['style-loader','css-loader','less-loader']},
]
}
-
打包处理样式表中与 url 路径相关的文件
运行 npm i url-loader@4.1.1 file-loader@6.2.0 -D 命令;
在 webpack.config.js 的 module 的 rules 数组中,添加 loader 如下:
module: { rules: [ {test: /\.jpg|png|gif$/, use:'url-loader?limit=xxxx'}, ] }
(? 之后的是 loader 的参数项: limit 用来指定图片的大小,单位是字节;只有 ≤ limit 大小的图片,才会被转为 base64 格式的图片)
-
那些webpack 无法处理的高级 js 语法,需要借助于 babel-loader 进行打包处理。
(1)安装 babel-loader 相关的包:运行如下的命令安装对应的依赖包:
npm i babel-loader@8.2.2 @babel/core@7.14.6 @babel/plugin-proposal-decorators@7.14.5 -D
(2)在 webpack.config.js 的 module 的rules 数组中,添加 loader 如下:
module: { rules: [ { test: /\.js$/, use: 'babel-loader', exclude: /node_modules/ } ] }
(3)在项目根目录下,创建名为 babel.config.js 的配置文件,定义 Babel 的配置项如下:
module.exports = { plugins: [['@babel/plugin-proposal-decorators', { legacy: true }]] }
-
打包发布
(1)项目开发完成后需要使用 webpack 对项目进行打包发布,因为开发环境下,打包生成的文件存放于内存中,无法获取到最终打包生成的文件;打包生成的文件不会进行代码压缩和性能优化,可以让项目能够在生产环境中高性能的运行。
(2)在 package.json 文件的 scripts 节点下,新增 build 命令:
"scripts": { "dev": "webpack serve", "build": "webpack --mode production" //"build"名字可改成其他的 },
接着在cmd输入npm run build 即可(ps:–model 是一个参数项,用来指定 webpack 的运行模式。production 表示生产环境,会对打包生成的文件进行代码压缩和性能优化同时会覆盖 webpack.config.js 中的 model 选项)
(3)把js文件统一生成到js目录中:
在 webpack.config.js 配置文件的 output 节点中:
output: {
path: path.join(__dirname,'dist'),
//生成的文件名
filename:'js/bundle.js'
},
(4)把图片文件统一生成到 image 目录中
修改 webpack.config.js 中的 url-loader 配置项,新增 outputPath 选项:
{test: /\.jpg|png|gif$/, use:'url-loader?limit=470&outputPath=images'},
(5)为了避免dist里面重复文件需要手动删除,比较麻烦,使用clean-webpack-plugin插件可以自动清理 dist 目录下的旧文件,安装步骤:
1.cmd输入如下命令:
npm install --save-dev clean-webpack-plugin
2.在webpack.config.js文件下添加:
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
//直接在原有的plugins里添加
plugins:[htmlPlugin, new CleanWebpackPlugin()]
3.使用npm run dev 测试即可
-
Source Map
(1)Source Map 是一个信息文件,储存着位置信息。Source Map 文件中存储着压缩混淆后的代码,所对应的转换前的位置。当出错的时候,除错工具将直接显示原始代码和位置信息,方便后期的调试。
(2)开发环境下默认生成的 Source Map,记录的是生成后的代码的位置。会导致运行时报错的行数与源代码的行
数不一致的问题,解决方法:
//在webpack.config.js的module.exports下添加如下: devtool: 'eval-source-map',
(3) 在生产环境下省略 devtool 选项,则最终生成的文件中不包含 Source Map,这能够防止原始代码通过 Source Map 的形式暴露给其他人。
(4)在生产环境下(实际发布时),如果只想定位报错的具体行数,且不想暴露源码,可以将 devtool 的值设置为nosources-source-map;如果想在定位报错行数的同时,展示具体报错的源码。此时可以将 devtool 的值设置为source-map。
(5) Source Map 的使用建议
开发环境下:建议把 devtool 的值设置为 eval-source-map,
可以精准定位到具体的错误行;
生产环境下:建议关闭 Source Map 或将 devtool 的值设置为 nosources-source-map,防止源码泄露,提高网站的安全性
(3) 在生产环境下省略 devtool 选项,则最终生成的文件中不包含 Source Map,这能够防止原始代码通过 Source Map 的形式暴露给其他人。
(4)在生产环境下(实际发布时),如果只想定位报错的具体行数,且不想暴露源码,可以将 devtool 的值设置为nosources-source-map;如果想在定位报错行数的同时,展示具体报错的源码。此时可以将 devtool 的值设置为source-map。
(5) Source Map 的使用建议
开发环境下:建议把 devtool 的值设置为 eval-source-map,
可以精准定位到具体的错误行;
生产环境下:建议关闭 Source Map 或将 devtool 的值设置为 nosources-source-map,防止源码泄露,提高网站的安全性