文章目录
webpack
webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 webpack 处理应用程序时,它会在内部从一个或多个入口点构建一个 依赖图(树状结构图),然后将你项目中所需的每一个模块组合成一个或多个 bundles,它们均为静态资源,用于展示你的内容。
几个基础概念
首先要先了解几个概念:
- 模块:模块是构建应用程序的基本单元。它们可以是 JavaScript 文件、CSS 文件、图片或其他任何类型的资源。
- chunk:Webpack 将模块分组成 chunks。一个 chunk 是一组模块和它们的依赖,它们可以一起被加载。Chunks 可以是入口点的初始 chunk,也可以是按需加载的异步 chunk。这种分组方式有助于代码拆分,从而优化应用程序的加载性能。
- bundle:最终,Webpack 将这些 chunks 转换成一个或多个 bundle。一个 bundle 是一种打包后的文件,它包含了运行应用程序所需的所有模块和资源。Webpack 可以输出不同格式的 bundle,以适应不同的环境和需求,例如单页面应用程序的全局 bundle 或多页面应用程序的多个入口点对应的多个 bundle。
- 树结构:Webpack 内部构建了一个依赖图,这是一个树状结构,用于表示模块之间的依赖关系。树的根是入口文件,从那里开始,Webpack 递归地追踪所有导入的模块,形成一个完整的依赖图。
如图:就是一个webpack树结构,从index这个文件为入口开始,Webpack 递归地追踪所有导入的模块(),形成一个完整的依赖图。然后又会对模块进行分组成为chunks,最后经过webpack的转换,输出了不同格式的bundle。
webpack是一个基于node.js的框架,使用之前要确保已经安装。
安装webpack
npm i webpack -g
npm i webpack-cli -g
运行 npm i webpack -g 全局安装Webpack,安装到全局可以在任何地方共用一个Webpack可执行文件,而不用各个项目重复安装。如果是 webpack4.0 以上的版本,需要运行 npm i webpack -g 全局安装 Webpack-cli。
webpack -v #验证
webpack简单体验一下
-
创建一个新的文件夹存放项目文件
-
初始化 npm,在项目文件夹中,初始化一个新的 npm 项目,并创建一个
package.json
文件。npm init -y
-
创建源文件,在你的项目根目录下,创建一个名为
src
的文件夹,并在其中创建一个index.js
文件。这将是你的 JavaScript 入口文件,在index.js
文件中,添加一些示例代码:// src/index.js console.log('Hello, Webpack!');
创建一个index.html文件作为测试,
html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>webpack_demo</title>
</head>
<body>
<h1>hello,Webpack!</h1>
<script src="./src/index.js"></script>
</body>
</html>
-
执行打包命令
npx webpack
会生成dist文件及dist/main.js
- 将index.html的index.js的引用改成main.js的引用
运行后的效果与之前一致。这都是在没有依赖的情况下的打包。
接着看一个有依赖情况下的打包例子:
在上述例子的基础上,新建一个data.js作为依赖,
js
// src/data.js
export function getList{
return ['冠军','亚军','季军'];
}
js
// src/index.js
const { getList } = require("./data");
console.log(getList());
然后再次打包,此时生成的mian.js就不太一样了,
js
// dist/main.js
(()=>{var e={802:(e,t,r)=>{"use strict";function o(){return["冠军","亚军","季军"]}r.r(t),r.d(t,{getList:()=>o})}},t={};function r(o){var n=t[o];if(void 0!==n)return n.exports;var i=t[o]={exports:{}};return e[o](i,i.exports,r),i.exports}r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{const{getList:e}=r(802);console.log(e())})()})();
此时将创建的这个bundle文件引入index.html文件,即可查看到结果。
webpack的核心------配置文件
默认是webpack.config.js
,这个配置文件包含了 Webpack 需要知道的所有信息:
-
入口(entry):entry 是指 webpack 应该从哪里开始以什么为起点,来作为构建其内部 依赖图 的开始。
-
输出(output):output 告诉 webpack 在哪里输出它所创建的 bundle,以及如何命名这些文件。
-
加载器(loader) :Webpack 本身只能处理 JavaScript 和 JSON 文件, Loaders 可以将所有类型的文件转换为 Webpack 能够处理的有效模块,从而可以在你的应用程序中使用这些文件。
-
插件(plugin):loader 用于转换某些类型的模块,而插件则可以用于执行范围更广的任务。包括:打包优化,资源管理,注入环境变量,用来增强和定制 Webpack 构建流程的功能。
-
模式(mode)) :Webpack 允许你为不同的环境设置不同的模式,如 development (开发)或 production(生产)。不同的模式会影响 Webpack 的构建行为,例如,在生产模式下 bundle 的大小要小于开发模式下。
现在来简单的配置一下:
js
const path = require("path")
module.exports = {
mode:"development",
entry:"./src/index.js",
output:{
filename:"dist.js",
path: path.resolve(__dirname, "dist"),
// path.resolve方法会解析一个路径字符串,使其指向一个绝对路径。
// __dirname 是一个全局变量,它返回根目录的绝对路径
// 这个方法会根据给定的一系列路径或路径片段,解析出最终的绝对路径。
// 所以最后bundle文件会生成在 根目录/dist/dist.js
},
}
现在再次打包运行一下,会根据配置生成bundle文件。
css文件的加载
前面说了,Webpack 本身只能处理 JavaScript 和 JSON 文件,那么要处理css文件就要使用loader了。
-
下载依赖
npm add --dev style-loader css-loader
--dev 表示 把依赖安装到开发者依赖里,因为在打包后都不需要这些依赖了
-
配置
module.rules
数组中添加一个对象。每个对象描述了哪些文件应该被哪个 loader 处理,以及如何处理它们。
const path = require("path")
module.exports = {
mode:"development",
entry:"./src/index.js",
output:{
filename:"dist.js",
path: path.resolve(__dirname, "dist"),
// path.resolve方法会解析一个路径字符串,使其指向一个绝对路径。
// __dirname 是一个全局变量,它返回根目录的绝对路径
// 这个方法会根据给定的一系列路径或路径片段,解析出最终的绝对路径。
// 所以最后bundle文件会生成在 根目录/dist/dist.js
},
module: {
rules: [
{
test: /\.css$/i,
use: ["style-loader", "css-loader"],
},
],
}
}
- 添加css文件
css
ul{
background-color: blueviolet;
font-size: 10px;
}
li{
color: red;
font-size: 20px;
}
然后import到index.js文件中,之后打包运行:
图片等静态文件的加载
- 配置webpack.config.js
js
const path = require("path")
module.exports = {
mode:"development",
entry:"./src/index.js",
output:{
filename:"dist.js",
path: path.resolve(__dirname, "dist"),
// path.resolve方法会解析一个路径字符串,使其指向一个绝对路径。
// __dirname 是一个全局变量,它返回根目录的绝对路径
// 这个方法会根据给定的一系列路径或路径片段,解析出最终的绝对路径。
// 所以最后bundle文件会生成在 根目录/dist/dist.js
},
module: {
rules: [
{
test: /\.css$/i,
use: ["style-loader", "css-loader"],
},{
test: /\.(png|svg|jpg|jpeg|gif)$/i,
type: "asset/resource",
},
],
}
}
2.导入图片
js
import "./style.css";
import carImage from "./assets/images/car.png" // 导入一个图片文件并将其作为一个模块的默认导出赋值给变量 car。
const { getList } = require("./data");
const rank = getList();
const ul = document.createElement("ul");
rank.forEach(rankItem => {
const li = document.createElement("li")
li.innerText = rankItem;
ul.appendChild(li);
});
document.body.appendChild(ul);
const image = document.createElement("img");
image.src = carImage;
document.body.appendChild(image);
import car from "./assets/images/car.png",是告诉 Webpack :
- 找到
./assets/images/car.png
这个文件- 使用配置的 loader 处理这个图片文件。
- 将处理后的结果作为默认导出。
- 创建一个变量
car
并将默认导出的值赋给它。
然后import到index.js文件中,之后打包运行:
自动生成html的插件
html-webpack-plugin插件
可以自动编写index.html的代码,就不需要手动编写添加dist.js了。
-
安装
npm add html-webpack-plugin --dev
-
配置
webpack.config.js
js
const path = require("path")
const HtmlWebpackPlugin = require("html-webpack-plugin")
module.exports = {
mode:"development",
entry:"./src/index.js",
output:{
filename:"dist.js",
path: path.resolve(__dirname, "dist"),
// path.resolve方法会解析一个路径字符串,使其指向一个绝对路径。
// __dirname 是一个全局变量,它返回根目录的绝对路径
// 这个方法会根据给定的一系列路径或路径片段,解析出最终的绝对路径。
// 所以最后bundle文件会生成在 根目录/dist/dist.js
},
module: {
rules: [
{
test: /\.css$/i,
use: ["style-loader", "css-loader"],
},{
test: /\.(png|svg|jpg|jpeg|gif)$/i,
type: "asset/resource",
},
],
},
plugins: [new HtmlWebpackPlugin({
title: "排名"
})]
}
现在运行打包后会在dist目录下自动生成一个index.html文件,运行效果与之前的效果一样。
本人也处于学习阶段,若有错误与不足请指出,关注DPT一起进步吧。