翼度科技»论坛 编程开发 JavaScript 查看内容

Webpack 插件实现 CSS 样式尺寸单位转换

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
Webpack 插件实现 CSS 样式尺寸单位转换

实现方式一

插件代码

以下是编写的一个 Webpack 插件,用于将样式文件中以 rpx 为单位的值转换为以 px 为单位的值(换算比率为 1px=2rpx):
  1. const pluginName = "CssSzieConvertPlugin";
  2. class CssSzieConvertPlugin {
  3.   apply(compiler) {
  4.     compiler.hooks.emit.tap(pluginName, (compilation) => {
  5.       for (const chunk of compilation.chunks) {
  6.         for (const file of chunk.files) {
  7.           if (file.endsWith(".css")) {
  8.             const originalSource = compilation.assets[file].source();
  9.             const newSource = originalSource.replace(
  10.               /\b(\d+(\.\d+)?)(rpx)\b/g,
  11.               (match, number) => `${number / 2}px`
  12.             );
  13.             compilation.assets[file] = {
  14.               source: () => newSource,
  15.               size: () => newSource.length,
  16.             };
  17.           }
  18.         }
  19.       }
  20.     });
  21.   }
  22. }
  23. module.exports = CssSzieConvertPlugin;
复制代码
上面的代码创建了一个名为 CssSzieConvertPlugin 的插件类。该插件通过注册到 Webpack 的 emit 钩子上来处理样式文件。
在钩子回调函数中,首先遍历所有的 chunk 和文件,并检查哪些文件是 CSS 文件。通过检查文件扩展名是否为 .css 来识别 CSS 文件。
然后,获取原始文件的源代码,并使用正则表达式 /\b(\d+(\.\d+)?)(rpx)\b/g 匹配所有以 rpx 为单位的数字。使用 replace 方法将每个匹配项替换为一个新的值。使用一个回调函数,将匹配项中的数字除以 2,并将单位从 "rpx" 更改为 "px"。
最后,更新 compilation.assets 对象中的文件源代码和大小,以便 Webpack 可以使用更新后的文件替换原始文件。
使用代码

在 Webpack 配置文件中使用这个插件,例如:
  1. const CssSzieConvertPlugin = require("./CssSzieConvertPlugin");
  2. module.exports = {
  3.   // ...
  4.   plugins: [
  5.     new CssSzieConvertPlugin(),
  6.     // ...
  7.   ],
  8. };
复制代码
这将在 Webpack 构建过程中自动应用编写的插件,并将样式文件中的 rpx 值转换为 px 值。
实现方式二

插件代码

以下是编写的另一个 Webpack 插件,用于将样式文件中以 rpx 为单位的值转换为以 px 为单位的值(换算比率为 1px=2rpx):
  1. const pluginName = "CssSzieConvertPlugin";
  2. class CssSzieConvertPlugin {
  3.   constructor(options) {
  4.     this.options = options || {};
  5.   }
  6.   apply(compiler) {
  7.     compiler.hooks.emit.tapAsync(pluginName, (compilation, callback) => {
  8.       const { test = /\.css$/, exclude = /node_modules/ } = this.options;
  9.       const files = Object.keys(compilation.assets).filter(
  10.         (filename) => test.test(filename) && !exclude.test(filename)
  11.       );
  12.       files.forEach((file) => {
  13.         let source = compilation.assets[file].source();
  14.         // 使用正则表达式匹配所有以 rpx 为单位的数字
  15.         if (source.replace) {
  16.           // 判断条件解决 TypeError: source.replace is not a function 问题
  17.           source = source.replace(
  18.             /\b(\d+(\.\d+)?)(rpx)\b/g,
  19.             (match, p1) => `${p1 / 2}px`
  20.           );
  21.         }
  22.         // 更新编译后的代码
  23.         compilation.assets[file] = {
  24.           source: () => source,
  25.           size: () => source.length,
  26.         };
  27.       });
  28.       callback();
  29.     });
  30.   }
  31. }
  32. module.exports = CssSzieConvertPlugin;
复制代码
该插件类名为 CssSzieConvertPlugin,构造函数接受一个选项对象作为参数,该选项对象包含两个属性:test 和 exclude,它们分别表示要处理的文件类型和要排除的文件。默认情况下,test 属性为 /\css$/,exclude 属性为 /node_modules/。
在 apply 方法中,使用 Webpack 的 emit 钩子来处理样式文件。首先使用选项中的正则表达式来过滤要处理的文件,然后遍历这些文件并对它们的源代码进行处理。
对于每个文件,使用正则表达式 /\b(\d+(\.\d+)?)(rpx)\b/g 匹配所有以 rpx 为单位的数字,并将每个匹配项替换为该数字除以 2 的结果。最后,更新编译后的代码,并将更新后的源代码和大小存储在 compilation.assets 对象中。
使用代码


  • 在 Webpack 配置文件中使用这个插件,例如:
    1. const CssSzieConvertPlugin = require("./CssSzieConvertPlugin");
    2. module.exports = {
    3.   // ...
    4.   plugins: [
    5.     new CssSzieConvertPlugin({
    6.       test: /\.wxss/,
    7.       exclude: /node_modules/,
    8.     }),
    9.     // ...
    10.   ],
    11. };
    复制代码
    这将在 Webpack 构建过程中自动应用编写的插件,并将样式文件中的 rpx 值转换为 px 值。在上面的示例中,指定了要处理的文件类型为 .wxss 文件,并排除了 node_modules 目录中的文件。
  • 在基于 Webpack 构建工具的 Vue 项目中配置,例如:
    1. // vue.config.js
    2. const CssSzieConvertPlugin = require("./CssSzieConvertPlugin");
    3. module.exports = {
    4.   configureWebpack: {
    5.     plugins: [
    6.       new CssSzieConvertPlugin({
    7.         test: /\.(css|js|html)/,
    8.         exclude: /node_modules/,
    9.       }),
    10.     ],
    11.   },
    12. };
    复制代码

来源:https://www.cnblogs.com/yuzhihui/p/17463475.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具