webpack基础打包技术

网友投稿 884 2022-05-29

Webpack是一种前端资源构建工具,一个静态模块打包器(module bundler)。在 Webpack看来,前端的所有资源文件(js/json/css/img/less/...)都会作为模块处理。它将根据模块的依赖关系进行静态分析,打包生成对应的静态资源(bundle)。webpack是一个给js准备的打包工具,官方的定义也就是一个打包器。它可以把很多的模块打包成很少的静态文件。webpack有一个自己的特性,就是代码分割;代码分割使得项目在加载时只加载当时需要的一些文件。

9.1 webpack简介

9.1.1 webpack概念

Webpack    是一个模块打包器。它将根据模块的依赖关系进行静态分析,然后将这些模块按照

指定的规则生成对应的静态资源。打包如下图8.1所示。

图9.1 webpack打包图框架

Webpack的特点如下:

• 代码拆分

Webpack有两种组织模块依赖的方式,同步和异步。异步依赖作为分割点,形成一个新的块。在优化了依赖树后,每一个异步区块都作为一个文件被打包。

• Loader

Webpack本身只能处理原生的    JavaScript模块,但是loader转换器可以将各种类型的资源转换成JavaScript模块。这样,任何资源都可以成为    Webpack    可以处理的模块。

• 智能解析

Webpack有一个智能解析器,几乎可以处理任何第三方库,无论它们的模块形式是CommonJS、AMD还是普通的    JS文件。甚至在加载依赖的时候,允许使用动态表达式require("./templates/"+name+".jade")。

• 插件系统

Webpack还有一个功能丰富的插件系统。大多数内容功能都是基于这个插件系统运行的,还可以开发和使用开源的    Webpack    插件,来满足各式各样的需求。

• 快速运行

Webpack使用异步I/O和多级缓存提高运行效率,这使得    Webpack    能够以令人难以置信的速度快速增量编译。

9.1.3 webpack安装

首先要安装 Node.js,Node.js自带了软件包管理器    npm,Webpack需要Node.js    v 0.6    以上支持,建议使用最新版Node.js。

webpack是前端的一个项目构建工具, 是基于node.js开发出来的一款工具;

webpack安装的安装步骤如下所示。

第一步骤:在本地安装webpack和webpack-cli,其中,--save-dev是本地安装。如果全局安装参数是-个,全局的指的是电脑上安装的webpack包, 所有项目都可以使用。本地webpack是指当前项目的webpack包. 通常全局webpack版本会比较高。

npm i webpack webpack-cli --save-dev

查看版本号:

webpack -v                        // 查看命令

webpack 5.44.0                    // 显示版本号

注意:如果当前的webpack本号是4.x版本,可以npm install webpack@latest -D进行升级。

9.1.2 webpack入门案例

为了更好的来理解webpack的使用,我们使用Visual Studio Code开发工具来演示,接下是详细步骤。

(1) 新建一个文件夹chapter08,然后创建src、dist目录,使用Visual Studio Code打开,如图9.2所示。

图9.2 创建chapter08目录

(2) 建立好目录后,在当前目录下使用“npm init -y”初始化命令,在init的时候省去了逐步敲回车的步骤,生成的默认的package.json。

(3) 在src目录下导入jquery.min.js,该文件从资源库或网上获取,然后在src目录下创建main.js文件,代码如下所示。

1 $(function(){

2 $('p').css('background','green');

3 });

(4) 接下来在src目录下面创建index.html,代码如下所示。

1

2

3

4

5

6 Document

7 ”,修改为“”,再次刷新页面会发现p标签背景已经发生了变化。如图8.8所示。

图9.8 “npm run dev”下的index.html修改效果

但是此时出现的问题是,是需要我们在地址栏每次都输入要访问的页面名称,那由没有一种方法不用我们输入页面名称呢?我们可以在5.2.1的webpack.config.js第15行代码之后增加如下代码段。

1 , // 注意增加逗号

2 //只在内存中打包,不会输出,启动命令为webpack-dev-server

3 devServer:{

4 contentBase:path.join(__dirname,"src"),

5 compress:true,

6 port:3000,

7 open:true,

8 hot:true

9 }

接下来,在客户端运行“num run dev”,会直接进入到浏览器页面,p标签背景色为红色,如果我们将main.js的背景色修改为“yellow”后,p标签背景色会在浏览器即时显示为黄色。如图8.8所示。

图9.9 修改main.js后的index.html效果

注意:读者在阅读的时候,为了减少创新的文件和案例,会在之前的文件上进行修改。

5.2.3 生成html插件

我们使用webpack-dev-server能够实现自动打包编译,生成的bundle.js在内存中,不被用户看到,还要设置script的src标签为 /bundle.js 才能实现自动打包编译。那么我们能否不用自动配置script的src属性呢?

使用webpack的插件,html-webpack-plugin能够实现在内存中创建index.html,并且不用设置script标签,这个插件自动为我们导入生成的bundle.js。

首先,在VS Code终端下使用“npm i html-webpack-plugin -D”安装html-webpack-plugin插件,安装完毕package.json可以看到。

"devDependencies": {

"html-webpack-plugin": "^5.3.2",

"jquery": "^3.6.0",

"webpack": "^5.45.1",

"webpack-cli": "^4.7.2",

"webpack-dev-server": "^3.11.2"

}

既然是一个基于webpack的插件,那么配置就肯定是要在webpack.config.js中进行的。接下来,修改webpack.config.js文件,修改后的代码如下所示。

1 const path = require('path');

2 const htmlWebpackPlugin = require("html-webpack-plugin");        // 新增代码

3 module.exports = {

4     //入口起点

5     entry:path.join(__dirname,'./src/main.js'),//入口

6     //输出路径以及文件名字

7     output:{

8         path:path.join(__dirname,'./dist'),

9         filename:'bundle.js'

10     },

11     //配置loader

12     module:{

13         rules:[]

14     },

15     //配置插件

16     plugins:[

17                                             //新增代码,用来生成内存中的html页面

18         new htmlWebpackPlugin({

19 // 需要复制在内存中的文件路径

20             template:path.join(__dirname,"./src/index.html"),

21             filename:"index.html"         // 复制完成后的文件名

22         }),

23     ],

24     //设置模式,开发模式和生产模式只能配置一个

25     mode:'development',

26     //只在内存中打包,不会输出,启动命令为webpack-dev-server

27     devServer:{

28         contentBase:path.join(__dirname,"src"),     // 设置启动后访问的目录

29         compress:true,                              // 配置是否启用 gzip 压缩

30         port:8888,                                  // 更改服务器端口号

31         open:true,                                  // 启动后直接打开浏览器

32         hot:true                                    // 设置局部刷新

33     }

34 }

将index.html中的script删除后,运行“npm run dev”命令。运行结果如图8.8所示。

图9.10 html插件运行的index.html效果

在该页面上单击鼠标右键,查看当前页面源码。如下所示。

1

2

3

4

5

6

7