Webpack 是前端开发中常用的打包工具,它可以将多个 JavaScript、CSS、图片等文件打包成一个或多个文件,并实现代码优化、文件压缩等功能。但是在使用 Webpack 打包时,由于各个资源之间的依赖关系以及资源的引用方式不同,会出现如下几个问题:
- 外部资源(如 CDN 资源)无法被自动处理,需要手动处理资源引用路径,以及添加 subresource integrity(SRI)等属性。
- 在某些情况下,我们希望将某些资源直接引入 HTML 中,而不是打包到 js 文件中,如字体文件。
- 当我们使用 Webpack 打包多个应用时,公共依赖如果被打包多次会造成无谓的代码冗余。
针对这些问题,我们可以使用 webpack-extract-subresource-integrity 这个 npm 包来解决。
什么是 webpack-extract-subresource-integrity
webpack-extract-subresource-integrity 是一个 Webpack 插件,可以将 Webpack 打包生成的 JavaScript、CSS 等资源文件中的外部资源(如 CDN 资源)转为本地文件,并添加 subresource integrity(SRI)等属性。它的主要特点包括:
- 可以自动处理并替换 js 文件中的外部资源引用路径,并在 HTML 中添加 SRI 属性。
- 可以将某些文件(如字体、图标)直接引入到 HTML 中,而不是打包到 js 文件中,以加快页面加载速度和减少应用的大小。
- 能够去除重复的依赖项,减少应用代码的冗余。
如何使用 webpack-extract-subresource-integrity
下面我们将演示如何使用 webpack-extract-subresource-integrity 这个 npm 包,将 project1 和 project2 两个应用的公共依赖打包成一个文件,并将字体引入 HTML 中。
安装
首先需要对 webpack-extract-subresource-integrity 进行安装
npm install webpack-extract-subresource-integrity --save-dev
配置
在 Webpack 配置文件中,需要添加 webpack-extract-subresource-integrity 插件。具体配置如下:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ---------------------------------- - ------------------------------------------------- -------------- - - ------ - --------- -------------------- --------- ------------------- -- ------- - ----- ----------------------- ------- -- ------------- - ------------ - ------------ - ------- - ----- ------------------------- ----- --------- ------- ------ -------- ---- - - - -- -------- - --- ------------------------------------ ------------------- ----- ------------------ ----- -------------------- ----- -------------------- ----- ---------------------------- ----- ---------- ------------ ---------------- -- - ---- -- - --
这里的主要配置项包括:
- enableCssIntegrity:是否启用对 CSS 的 SRI 属性处理。
- enableJsIntegrity:是否启用对 JavaScript 的 SRI 属性处理。
- enableFontIntegrity:是否启用对字体的处理,将其 inline 到 HTML 中。
- enableIconIntegrity:是否启用对图标的处理,将其 inline 到 HTML 中。
- removeDuplicateDependencies:是否启用去重功能,去除多个应用中的可能重复的共享依赖。
- fileNames:生成的文件名模板。
- fontInlineLimit:字体文件 inline 的最大大小,超过这个大小的将被打包到 js 文件中。
示例代码
接下来我们将根据上面的配置文件打包 project1 和 project2 两个应用,示例代码如下:
-- -------------------- ---- ------- -- --------------- ------ - ---- - ---- ------------ ------ ----------------- ------- -- --------------- ------ - ---- - ---- ------------ ------ ----------------- ------- -- ---------------- ------- ------------------------------------- --------- -- -- ---------------- --------- --
上面的示例代码中,我们在 project1 和 project2 中引入了 lodash-es 依赖,它们位于 node_modules 目录中。而我们的 Webpack 配置文件指定了将这些依赖打包到 'common.js' 文件中,因此我们可以看到打包生成的文件如下:
dist/ |- common.js |- project1.js |- project2.js
其中 common.js 为包含 lodash-es 依赖的公共依赖文件。我们使用 Webpack 生成的 HTML 文件如下:
-- -------------------- ---- ------- ---- --------------- --- --------- ----- ------ ------ ----- ---------------- -------------- ----------- ----- --------------------- ----------------- ----- --------------------- ----------------- ----- ------------------ ----------------- ----------------------------------------------------------------------------------- ------------------------ ------- ------ ------- ----------------- ----------------------------------------------------------------------------------- --------------------------------- ------- ------------------- ----------------------------------------------------------------------------------- --------------------------------- ------- ------------------- ----------------------------------------------------------------------------------- --------------------------------- ------- -------
在生成的 HTML 文件中,我们可以看到 common.js 文件被添加了 subresource integrity(SRI)属性,而字体文件则被 inline 到了 HTML 中。
总结
在实际的开发中,我们经常需要使用 Webpack 进行应用的打包。然而,由于应用之间存在较多的依赖关系以及资源引用方式不同等原因,会导致一些问题的出现,如外部资源无法自动处理、字体文件过多、公共依赖冗余等问题。本文我们介绍了 webpack-extract-subresource-integrity 这个 npm 包的使用方法,可以自动解决上述问题,并生成更加优化的应用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/600671d730d0927023822d03