最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 记录一个webpack插件的书写过程

    正文概述 掘金(陈天宝)   2021-03-02   723

    简介

    最近在做一个公共ui组件库的开发工作,针对公共库,有一定的规范,比如需要一个压缩版本,一个未压缩版本,一个索引文件。一般生成后的目录如下:

    • xxx.js
    • xxx.min.js
    • index.js
    // 索引文件的内容
    if (process.env.NODE_ENV == "production") {
       module.exports = require("./xxx.min.js");
    } else {
      module.exports = require("./xxx.js");
    }
    

    生成压缩和未压缩版本,我们可以配置两个entry,然后使用terser-webpack-plugin,指定文件压缩。webpack的大概配置文件如下:

    module.exports = {
     entry: {
          'button': 'src/button/index.js',
          'button.min': 'src/button/index.js'
      },
      mode: 'none',
      output: {
          path: './dist',
          filename: '[name].js',
          library: 'xxx',
          libraryTarget: 'umd'
      },
      optimization: {
          minimize: true,
          minimizer: [
              new TerserPlugin(
                  {test: /\.min\.js$/}
              ),
          ]
      }
    }
    

    当有多个组件时, 遇到的问题:

    • 文件目录的组织形式,不符合要求。

    当前的: 记录一个webpack插件的书写过程

    期望的: 记录一个webpack插件的书写过程

    • 需要添加一个索引文件,根据环境,动态的导入不同的版本。

    插件设计

    • 做目录合并,将button/button.js和button.min/button.min.js, 合并成button文件夹。
    button
    	button.js
    	button.min.js
    

    可以使用emit hooks, 在资源输出之前,是最佳的时机。

    • 为每一个组件,添加一个索引文件。

    编写插件

    // 插件代码
    class FoldingDirWebpackPlugin {
        constructor(options = {}) {
            this.options = options;
    
            // 插件处理完成的回调。
            this.cb = options.cb;
    
            // 文件夹折叠的规则。
            this.exp = options.exp;
        }
        
        apply(compiler) {
          // 在emit阶段插入钩子函数
          compiler.hooks.emit.tap('FoldingDirWebpackPlugin', (compilation) => {
            const {assets} = compilation;
            let newAssets = {};
    
            for (const key in assets) {
                let newKey = key;
    
                if(this.exp){
                    if(typeof this.exp === 'string'){
                        newKey = key.replace(this.exp, '');
                    }else if(typeof this.exp === 'function'){
                        newKey = this.exp(key);
                    }
                }
                newAssets[newKey] = assets[key];
            }
    
            compilation.assets = newAssets;
    
            if(this.cb){
                this.cb(compilation);
            }
          });
        }
      }
      
      module.exports = FoldingDirWebpackPlugin;
    

    插件使用

    const FoldingDirWebpackPlugin = require('folding-dir-webpack-plugin')
    
    const generateIndex = compilation => {
        const {assets} = compilation;
    
        for (const key in assets) {
            if (Object.hasOwnProperty.call(assets, key)) {
                const arr = key.split('/');
                if (arr.length === 2) {
                    let fileName = arr[0];
                    const content = `if (process.env.NODE_ENV == "production") {module.exports = require("./${fileName}.min.js");} else {module.exports = require("./${fileName}.js");}`;
    
                    compilation.assets[`${fileName}/index.js`] = {
                        source() {
                            return content;
                        },
                        size() {
                            return content.length;
                        }
                    };
                }
            }
        }
    }
    
    module.exports = {
    	// ...
        plugins: [
                new FoldingDirWebpackPlugin(
                    {
                        exp: key => key.replace('.min/', '/'),
                        cb: generateIndex
                    }
                )
            ],
    };
    
    

    插件安装

    npm install -D folding-dir-webpack-plugin
    

    起源地下载网 » 记录一个webpack插件的书写过程

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元