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

这篇具有很好参考价值的文章主要介绍了Webpack 插件实现 CSS 样式尺寸单位转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

实现方式一

插件代码

以下是编写的一个 Webpack 插件,用于将样式文件中以 rpx 为单位的值转换为以 px 为单位的值(换算比率为 1px=2rpx):

const pluginName = "CssSzieConvertPlugin";

class CssSzieConvertPlugin {
  apply(compiler) {
    compiler.hooks.emit.tap(pluginName, (compilation) => {
      for (const chunk of compilation.chunks) {
        for (const file of chunk.files) {
          if (file.endsWith(".css")) {
            const originalSource = compilation.assets[file].source();
            const newSource = originalSource.replace(
              /\b(\d+(\.\d+)?)(rpx)\b/g,
              (match, number) => `${number / 2}px`
            );
            compilation.assets[file] = {
              source: () => newSource,
              size: () => newSource.length,
            };
          }
        }
      }
    });
  }
}

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 配置文件中使用这个插件,例如:

const CssSzieConvertPlugin = require("./CssSzieConvertPlugin");

module.exports = {
  // ...
  plugins: [
    new CssSzieConvertPlugin(),
    // ...
  ],
};

这将在 Webpack 构建过程中自动应用编写的插件,并将样式文件中的 rpx 值转换为 px 值。

实现方式二

插件代码

以下是编写的另一个 Webpack 插件,用于将样式文件中以 rpx 为单位的值转换为以 px 为单位的值(换算比率为 1px=2rpx):

const pluginName = "CssSzieConvertPlugin";

class CssSzieConvertPlugin {
  constructor(options) {
    this.options = options || {};
  }

  apply(compiler) {
    compiler.hooks.emit.tapAsync(pluginName, (compilation, callback) => {
      const { test = /\.css$/, exclude = /node_modules/ } = this.options;
      const files = Object.keys(compilation.assets).filter(
        (filename) => test.test(filename) && !exclude.test(filename)
      );

      files.forEach((file) => {
        let source = compilation.assets[file].source();

        // 使用正则表达式匹配所有以 rpx 为单位的数字
        if (source.replace) {
          // 解决 TypeError: source.replace is not a function 问题

          source = source.replace(
            /\b(\d+(\.\d+)?)(rpx)\b/g,
            (match, p1) => `${p1 / 2}px`
          );
        }

        // 更新编译后的代码
        compilation.assets[file] = {
          source: () => source,
          size: () => source.length,
        };
      });

      callback();
    });
  }
}

module.exports = CssSzieConvertPlugin;

该插件类名为 CssSzieConvertPlugin,构造函数接受一个选项对象作为参数,该选项对象包含两个属性:testexclude,它们分别表示要处理的文件类型和要排除的文件。默认情况下,test 属性为 /\css$/exclude 属性为 /node_modules/

apply 方法中,使用 Webpack 的 emit 钩子来处理样式文件。首先使用选项中的正则表达式来过滤要处理的文件,然后遍历这些文件并对它们的源代码进行处理。

对于每个文件,使用正则表达式 /\b(\d+(\.\d+)?)(rpx)\b/g 匹配所有以 rpx 为单位的数字,并将每个匹配项替换为该数字除以 2 的结果。最后,更新编译后的代码,并将更新后的源代码和大小存储在 compilation.assets 对象中。

使用代码

  1. 在 Webpack 配置文件中使用这个插件,例如:

    const CssSzieConvertPlugin = require("./CssSzieConvertPlugin");
    
    module.exports = {
      // ...
      plugins: [
        new CssSzieConvertPlugin({
          test: /\.wxss/,
          exclude: /node_modules/,
        }),
        // ...
      ],
    };
    

    这将在 Webpack 构建过程中自动应用编写的插件,并将样式文件中的 rpx 值转换为 px 值。在上面的示例中,指定了要处理的文件类型为 .wxss 文件,并排除了 node_modules 目录中的文件。

  2. 在基于 Webpack 构建工具的 Vue 项目中配置,例如:文章来源地址https://www.toymoban.com/news/detail-474654.html

    // vue.config.js
    const CssSzieConvertPlugin = require("./CssSzieConvertPlugin");
    
    module.exports = {
      configureWebpack: {
        plugins: [
          new CssSzieConvertPlugin({
            test: /\.(css|js|html)/,
            exclude: /node_modules/,
          }),
        ],
      },
    };
    

到了这里,关于Webpack 插件实现 CSS 样式尺寸单位转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • webpack5基础使用(1)-介绍、打包文件、处理样式资源(css、less)文件、配置文件内容、eslint工具检测语法、babel工具es6语法转es5

    webpack5是一个 静态资源打包工具 。 会以一个或多个文件作为打包的入口,将整个项目所有文件编译组合成一个或多个文件输出出去。输出的文件就是编译好的文件,就可以直接在浏览器端运行了 进一步来说就是: 当开发时,肯定会使用框架、es6模块化语法、less/sass等css预处

    2024年02月03日
    浏览(56)
  • css 实现四角边框样式

    效果如图 此图只实现 左下与右下边角样式 右上与左上同理 右上与左上 将上面的bottom改为top

    2024年02月10日
    浏览(34)
  • 实现 css 样式隔离的方法

    样式隔离是一种在 Web 开发中常用的技术,用于确保组件或模块之间的样式不会相互影响,从而提高代码的可维护性和可重用性 CSS Modules: CSS Modules 是一种将 CSS 文件转换成 JavaScript 模块的技术,其中每个 CSS 类都会被自动命名,从而避免了类名冲突。在使用 CSS Modules 时,每

    2024年02月21日
    浏览(42)
  • CSS 实现磨砂玻璃样式

    要实现磨砂玻璃背景,可以使用 CSS3 中的 ::before 伪元素和 backdrop-filter 属性,结合 opacity 属性和 blur() 函数来实现。 具体实现步骤如下: 创建一个具有背景的元素,例如一个 div 元素。 使用 ::before 伪元素为元素添加一个半透明的背景层。 在这个示例中,设置了 ::before 伪元素

    2024年02月05日
    浏览(35)
  • css实现border渐变样式

    项目中用到了border的渐变使用,虽然可以使用图片,但不如代码实现效果好,所以实现了border两头渐变的效果 效果如图:

    2024年02月11日
    浏览(46)
  • 用css如何实现样式延迟显示

    使用CSS要使元素的样式延时展示 虽然CSS最为一个样式语言并没有为我们提供这样的延时方法 但是我们可以使用 CSS3 中的 animation 动画属性来实现, 当然animation没办法单独去实现动画,我们需要 @keyframes去创建动画 非常简单的逻辑,就是在动画中定义一个样式,用animation实现

    2024年02月09日
    浏览(28)
  • 【福建事业单位-推理判断】01图形推理(位置,样式、属性、特殊)

    1.从前面推出最后一个 2.分组,从第一组找出规律,应用到第二组 3.不同行,从第一行找到规律,应用到第二行验证,第三行解题。(优先横行解题,找不到就纵列) 4.分组分类,分成几组 5.空间题 元素组成相同时候,就只能观察元素的位置变化。 空白也可以作为一个移动元

    2024年02月14日
    浏览(34)
  • CSS实现根据子元素数量应用不同样式

    在前端的页面布局中经常会出现在子元素个数使用不同的样式的需求,比如文章列表,在较少内容下单列表现,而在元素内容较多时使用双列表现。再比如在页面排版上,可以根据元素内容的多少来修改内容的缩放,位置,颜色等样式 : has()选择器中的括号传递一个选择器参

    2024年02月11日
    浏览(40)
  • css 纯样式实现绘出进度条

    效果: css代码: html代码:

    2024年02月04日
    浏览(59)
  • 【CSS】CSS 常用单位

    大小单位: px 。 字体相对单位: em 、 rem ;根据 [font-size] 进行计算。 视窗相对单位: vm 、 vh 、 vmax 、 vmin ;根据 [视窗大小] 进行计算。 em :相对于元素本身的 font-size 值。如果元素本身没有设置 font-size ,会继承父元素的 font-size 。 rem :相对于根元素( html 元素)的 f

    2024年02月13日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包