webpack
webpack 是前端项目工程化的具体解决方案
 主要功能:他提供了友好的前端模块化的支持,代码压缩,处理浏览器兼容性,性能优化等功能
npm init -y
npm install jquery -S
安装webpack
 npm install webpack webpack-cli -D
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eDBNeXOp-1648286335829)(images/4a48fb1f5cd3972e7b0cec59404d9c5b7608d6dda670d6273bb8ee226aa64579.png)]](https://file.cfanz.cn/uploads/png/2022/03/26/9/0c72012GF1.png)
-S --save
 -D --save-dev
通过npmjs.com查看安装时选择-S还是-D
index.js 配置基础语句 以隔行变色为例
// es6导入语法
import $ from 'jquery'
// 定义jquery入口函数
$(function(){
    $('li:odd').css('background-color','red')
    $('li:even').css('background-color','pink')
})
项目中配置webpack
1.创建webpack.config.js配置文件并初始化
module.exports = {
    // 代表webpack运行模式,可选值 development  production
    mode:'development'
}
2.在package.json的stript节点,新增dev脚本
  "scripts": {
    "dev":"webpack"
  },
3.在终端中运行npm run dev命令,启动webpack项目的打包构建
npm run dev
4.生成dest文件
 ![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nQR7rGju-1648286335830)(images/4618bfb93bfcb298ed25e542651c9a9ffa10bf9637d33b7d07742f259f9f04d1.png)]](https://file.cfanz.cn/uploads/png/2022/03/26/9/VU49344441.png)
5.修改index.html下 js引入路径
<!-- <script src="index.js"></script> -->
<script src="../dist/main.js"></script>
webpack可选值应用场景
module.exports = {
    // 代表webpack运行模式,可选值 development  production
    mode:'production'
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zl8G9cuP-1648286335831)(images/63d0edabf5bbb75e1d9c077177422512ee81e26ab02165869af143ec958c960d.png)]](https://file.cfanz.cn/uploads/png/2022/03/26/9/58VcX01c48.png)
开发时使用development 因为追求的是打包的速度,而不是体积
 反过来 发布时使用production 因为上线需要的是体积小
webpack的默认约定
- webpack4.x和5.x的版本中 
  - 默认打包入口文件 src --> index.js
- 默认输出文件 dist --> main.js
 
导入node文件模块
const path = require("path/posix");
    // entry:指定要处理哪个文件
    entry:path.join(__dirname,'./src/index.js'),
    output:{
        // 存放目录
        path:path.join(__dirname,'dist'),
        // 生成的文件名
        filename:'bundle.js'
    }
webpack插件
webpack-dev-server
 自动打包和构建
 html-webpack-plugin
 webpack中的HTML插件,可以定制index.html页面内容
npm install webpack-cli -D
2.修改package.json
  "scripts": {
    "dev": "webpack serve"
  },
3.浏览器访问
 http://localhost:8080/

webpack在根目录中写入了一个bundle.js文件
 但这个文件是保存在内存中的,所以看不见
 更改html引用路径
<script src="/bundle.js"></script>
html-webpack-plugin
npm install html-webpack-plugin -D
1、导入HTML插件,得到一个构造函数
const HtmlPlugin = require('html-webpack-plugin')
2、创建HTML插件的实例对象
const htmlPlugin = new HtmlPlugin({
    template:'./src/index.html', // 指定要复制哪个页面
    filename:'./index.html'//指定复制出来的文件名和存放路径
  });
})
3、插件的数组,将来webpack在运行时,会加载并调用这些插件
 在module.exports里添加
plugins:[htmlPlugin]
复制后的页面会自动添加上内存里的js
devServer节点
    devServer:{
        open:true,//是否自动打开浏览器
        port:80,//指定端口号
        host:'127.0.0.1',//指定主机地址
    }
const path = require('path');
const HtmlPlugin = require('html-webpack-plugin'); //导入HTML插件
const htmlPlugin = new HtmlPlugin({   //创建实例对象
    template:'./src/index.html', // 指定要复制哪个页面
    filename:'./index.html'//指定复制出来的文件名和存放路径
  });
module.exports = {
    mode:'development',
    entry:path.join(__dirname,'./src/index.js'),
    output:{
        filename:'bundle.js'
    },
    plugins:[htmlPlugin],
    devServer:{
        open:true,//是否自动打开浏览器
        port:80,//指定端口号
        host:'127.0.0.1',//指定主机地址
    }
}
loader概述
webpack处理不了非.js后缀的模块
 需要调用loader加载器才可以正常打包
loader加载器的作用给:协助webpack打包处理器特定的文件模块
- css-loader 处理css
- less-loader 处理.less
- babel-loader 处理webpack无法处理的高级JS语法
现在在src文件下创建css文件下index.css
 在index.js中导入样式
import './css/index.css'
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qA7RT7Yn-1648286473040)(images/829636e6522442d6641685c05aff8042d71b372a01819026ffc7d46f46da001a.png)]](https://file.cfanz.cn/uploads/png/2022/03/26/9/P17BYfd0cc.png)
打包处理css文件
1.安装依赖
npm i style-loader css-loader -D
2.在webpack.config.js 的module->rules数组中,添加loader
    module:{//所有第三方文件模块的匹配机制
        rules:[
            {
                test:/\.css$/,user:['style-loader','css-loader']
            }
        ]
    }
test标识匹配的文件类型
 user标识要调用的loader
- user数组中指定的loader顺序是固定的
- 多个loader的调用顺序是从后往前调
打包处理less文件
1、运行安装命令
npm i less-loader less -D
2、在webpack.config.js 的module->rules数组中,添加loader
    module:{//所有第三方文件模块的匹配机制
        rules:[
            {
                test:/\.css$/,use:['style-loader','css-loader']
            },
            {
                test:/\.less$/,use:['style-loader','css-loader','less-loader']
            }
        ]
    }
处理url路径相关的文件
npm i url-loader file-loader
index.html
    <!-- 需求把/src/images/bg.jpg设置给src属性 -->
    <img src="" alt="" class="box">
index.js
// 导入图片,得到图片文件
// 导入图片,得到图片文件
import bg from './images/bg.jpg'
$('.box').attr('src',bg)
webpack.config.js
    module:{//所有第三方文件模块的匹配机制
        rules:[
            {
                test:/\.css$/,use:['style-loader','css-loader']
            },
            {
                test:/\.less$/,use:['style-loader','css-loader','less-loader']
            },{
                test:/.jpg|png|gif$/,use:['url-loader?limit-22229']
            }
        ]
    }
limit用来指定图片的大小,单位是字节
 只有≤limit大小的图片,才会被转为base64格式的图片
处理js文件的高级语法babel-loader
index.js
// 定义装饰器函数
function info(target){
    target.info = 'Person info'
}
// 定义一个普通的类
@info
class Person{}
console.log(Person.info)
1.安装babel-loader相关包
npm install -D babel-loader @babel/core @babel/preset-env @babel/plugin-proposal-decorators 
2.在webpack.config.js添加规则
{
  test: /\.m?js$/,
  exclude: /(node_modules|bower_components)/, // 排除不需要打包的目录
  use: {
    loader: 'babel-loader',
    options: {
      presets: ['@babel/preset-env']
      
    }
  }
}
3.在根目录创建babel.config.js
module.exports = {
    "plugins": [
        ["@babel/plugin-proposal-decorators", { "legacy": true }]
      ]
  }
注:babel插件文档
 webpack安装babel-loader文档
打包发布
1.开发环境下,打包生成的文件存放在内存中
 2.开发环境下,打包生成的文件不会进行代码压缩和性能化
配置webpack打包发布
在package.json在scripts节点下,新增build命令
"build":"webpack --mode production"
–mode是用来指定webpack的运行模式
 production代表生产环境,会对代码进行代码压缩和性能优化
注意:–model指定的参数项会覆盖webpack.config.js中的model选项
优化图片和文件的存放目录
在webpack.config.js中output模块下指定js存放目录
    output:{
        filename:'js/bundle.js'
    }
在webpack.config.js中module模块rules下指图片存放目录
 {
     test:/.jpg|png|gif$/,use:{
         loader:'url-loader',
         options:{
             limit:22228,
             // 明确指定打包生成的图片文件存储到dist目录下的images文件夹
             outputPath:'image'
         }
 }
自动清理dist目录下的旧文件
1.安装clean-webpack-plugin
npm install clean-webpack-plugin -D
2.在webpack.config.js中按需导入插件,得到插件的构造函数之后,创建插件的实例对象
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
3.把创建的cleanPlugin的插件实例对象,挂载到plugins节点上
plugins: [htmlPlugin,new CleanWebpackPlugin()]
4.webpack5.x之后,需要在output中配置path路径
output: {
    filename: 'js/bundle.js',
    path: path.resolve(process.cwd(), 'dist')
}
source Map
Source Map 就是一个信息文件,里面存储着位置信息。也就是说,Source Map文件中存储着压缩混淆后的代码所对应的位置
出错的时候,除错工具将直接显示原始代码,而不是转换后的代码
在开发调试的时候,建议将值设为eval-source-map
开发环境下,webpack默认启动了Source Map功能,当程序运行出错的时候,可以直接通过控制台提示错误行位置定位到具体的源代码,开发环境下添加以下代码,能保证报错代码与源代码行数保持一致
在webpack.config.js中添加
devtool:'eval-source-map'
在生产环境下,如果省略了devtool选项,则最终生成的未见不包含Source Map 这能防止源码泄露
 在生产环境下,如果想定位报错的具体行数,而不暴露源代码,可以将devtool的值设置为nosources-source-map
实际开发中,我们不需要自己配置webpack
 会使用CLI 一键生成带有webpack的项目
 开箱即用,我们只需知道webpack的基本概念即可
总结
1.能够掌握webpack的基本使用
 安装、webpack。config.js 修改打包入口
 2.了解常用的plugin的基本使用
 webpack-dev-server html-webpack-plugin
 3.了解常用的loader的基本使用
 loader的作用 loader的调用过程
 4.能够说出Source Map的作用
 精准定位到错误行并显示对应的源码
 方便开发者调试源码中的错误
补充 webpack 路径别名
webpack.config.js添加与module同级模块resolve
    resolve: {   //路径起别名
        alias: {
          '@': path.resolve(__dirname, './src/'),
        },
      },
使用@表示 src目录










