如何使用uglify-js压缩指定文件夹下的js代码

前言

客户来了需求:想使用公司的组件包,但组件包的源码不能对其开放,该怎么做呢?
发布后的组件包目录结构如下图所示:
在这里插入图片描述
其中,es文件夹下的js代码皆为esm(ES Module)模块

lib文件夹下的js代码皆为cjs(CommonJS)模块

起初,我是想使用uglify-js压缩es文件夹下的代码,但遇到了问题,通过google以及uglify-jsgithub上的文档说明才知道,uglify-js不支持压缩es模块,原文如下所示:

uglify-js supports JavaScript and most language features in ECMAScript.
For more exotic parts of ECMAScript, process your source file with transpilers like Babel before passing onto uglify-js.

需要借助Babel编译ECMAScript里更复杂的部分(呜呜,es里的js文件仅仅只有export defaultexport,再加一些箭头函数,通过uglify-js压缩后,其code却为undefined

只能暂时放弃压缩es里的js文件

解决方法

我选择用uglify-js压缩lib文件下的代码,并且lib文件下的组件可做到按需导入,极大地减少了代码的体积

新建了名为minifyJsjs文件,在里面编写压缩并替换源文件的代码,完整代码如下所示:

'use strict';

const fs = require('fs');
const path = require('path');
const UglifyJS = require('uglify-js')

const ROOT_PATH = path.join(__dirname, '../lib');
function readFileList(currentPath) {
    const files = fs.readdirSync(currentPath);

    files.forEach(file => {
        const childPath = path.join(currentPath, file);
        const stat = fs.statSync(childPath);
        if (stat.isDirectory()) {
            readFileList(childPath);
        } else {
            if(file.endsWith('.js')) {
                fs.writeFileSync(childPath, UglifyJS.minify({
                    "file.js": fs.readFileSync(childPath, "utf8"),
                }).code, "utf8", function (error) {
                    console.log(error)
                });
            }
            
        }
    })
}

readFileList(ROOT_PATH);
  • const ROOT_PATH = path.join(__dirname, '../lib');里的__dirnameNode.js里的全局变量,表示当前项目的根目录,使用path.join保证路径地址格式为E:\sf-map\packages\@sf\map-service\lib,即\分开
  • stat.isDirectory()是否为文件夹,若是的话,继续递归调用readFileList方法
  • fs.writeFileSync(childPath, content, 'utf8', func)content写入至childPath(比如:E:\sf-map\packages\@sf\map-service\lib\request.js),若childPath无该js文件,则会新增request.js,若有,则会直接覆盖

切记,该文件内,路径必须用path.join,不可使用相对路径,否则minifyJs的存放位置一旦发生改变,便会出现错误

package.json里增加如下scripts命令:

"scripts": {
	"pubmini": "node scripts/minifyJs.js",
}

运行npm run pubmini即可

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值