为什么引入webpack

必须了解ES6的模块化语法

ES6的模块化语法 - 掘金 (juejin.cn)

模块化必要性

希望一段代码有自己的作用域,没有命名冲突等

模块与脚本的区别

可以按需导入模块数据 ,但是不能按需导入脚本数据

模块语法

export 导出 import导入

1、定义变量同时暴露数据 在声明符前面加上export

// 定义一个变量并暴露
export let name = 'doug';

// 定义一个函数并暴露
export function say(){
    console.log('hello ' + name);
}

// 定义一个类并暴露
export class Student {
    constructor(name, age){
        this.name = name;
        this.age = age;
    }
}

// 定义一个函数,并不把它暴露出去, 其他模块从外部无法访问这个函数
function privateFunc(){
    console.log('我是私有成员,没有被暴露出去,所以别人没有办法访问到我');
}

对应的导入(导入的数据是没有办法直接改变的。但是可以间接的修改这个变量的值. 假如在模块 a 中定义了一个可以修改 name 值的函数, 则可以通过调用这个函数来修改 name 的值了)

import { name, say } from './a.js';

2、一次性导入一个模块暴露出来的所有数据,使用as对导入和导出的数据进行重命名

import * as aObj from './a.js'; // a 模块所有暴露出的数据都挂到了 aObj 上

// 通过 aObj 来访问和调用 a 模块中的变量和方法
console.log(aObj.name);
aObj.say();

// 导出
export {say as speak};
//导入
import { speak } from './a.js'

3、默认暴露

// 导出 
// 1. 定义的时候就暴露
export default function(){
    console.log('方法1暴露函数为默认值');
}

// 2. 先定义后暴露
let name = 'doug';
export default name;

// 3. 将这个值用 as 命名为 default 暴露
class Student{ // ... }
export {Student as default};

// 导入
// 不用 {} 来包裹 不使用 as 关键字将默认值重命名
import familyName from './a.js';

学习视频

69-原理-raw loader_哔哩哔哩_bilibili

学习笔记

前置知识 | 尚硅谷 Web 前端之 Webpack5 教程 (yk2012.github.io)

青训营笔记

前端由资源构成

webpack本质是一种前端资源编译、打包工具

核心流程

1、入口处理

从entry文件开始,启动编译流程

2、依赖解析

从entry文件开始,根据require或者import等语句找到依赖资源

3、资源解析

根据module配置,调用资源转移器,将png、css等非标准js资源转译为js内容

ps:递归调用2,3,直到所有资源处理完毕

4、资源合并打包

将转移后的资源内容合并打包为可直接在浏览器运行的js文件

使用webpack

基本围绕配置

1、流程类配置

作用于流程中某个or若干个环节,直接影响打包效果的配置项。

image-20230822224935825

2、工具类配置

主流程之外,提供更多工程化能力的配置项。

开始编译打包

npx webpack

HMR

Tree-Shaking

理解Loader

为了处理非标准JS资源,设计出资源翻译模块——Loader:用于将资源翻译为标准js

链式调用

其它特性:

链式执行

支持异步执行

分normal、pitch两种模式

理解插件