求教Nodejs中UglifyJS压缩SeaJS模块出现的问题

求教Nodejs中UglifyJS压缩SeaJS模块出现的问题

问题的原因是找到是
是应为UglifyJS.minify方法把模块里的require都替换了;

UglifyJS.minify(_files,{mangle:false});

这样修改之后是可以了,但是我只想排除"$,require,exports"这几个,要怎么配置。

求救。。。

3 回复

求教Nodejs中UglifyJS压缩SeaJS模块出现的问题

在使用 UglifyJS 压缩 SeaJS 模块时,遇到了一些问题。主要原因是 UglifyJS.minify 方法会将模块中的 require 等关键字替换掉,这会导致模块无法正常加载。

问题描述

我尝试使用 UglifyJS.minify 方法来压缩 SeaJS 模块,但发现它会把模块中的 require 关键字替换掉,导致模块无法正确执行。我的原始代码如下:

const UglifyJS = require('uglify-js');
const _files = ['path/to/your/module.js'];

// 原始的压缩方法
let result = UglifyJS.minify(_files, { mangle: false });
console.log(result.code);

通过设置 mangle: false,虽然可以避免 require 被替换,但我也希望保留 "$", "require", "exports" 这几个关键字不被混淆。

解决方案

为了只排除特定的关键字(如 "require"),我们可以自定义一个 transform 函数,并将其传递给 UglifyJS.minify 方法。这个函数会在压缩之前处理代码,以确保特定的关键字不会被混淆。

以下是具体的实现步骤:

  1. 引入 UglifyJS 库

    const UglifyJS = require('uglify-js');
    
  2. 定义保留的关键字数组

    const reservedWords = ['$', 'require', 'exports'];
    
  3. 创建一个 transform 函数

    const transformFunction = (code) => {
      // 使用 UglifyJS.parse 来解析代码
      let ast = UglifyJS.parse(code);
      
      // 遍历 AST 并保留指定的关键字
      ast.walk(new UglifyJS.TreeWalker(node => {
        if (node instanceof UglifyJS.AST_Symbol && reservedWords.includes(node.name)) {
          node.print_to_string = () => node.name;
        }
      }));
      
      return ast.print_to_string();
    };
    
  4. 调用 UglifyJS.minify 方法并传递 transform 函数

    const _files = ['path/to/your/module.js'];
    let result = UglifyJS.minify(_files, {
      mangle: false,
      fromString: true,
      output: {
        beautify: false
      },
      parse: {
        bare_returns: true
      },
      compress: {
        passes: 2
      },
      transform: transformFunction
    });
    
    console.log(result.code);
    

通过上述方法,我们可以在压缩过程中保留特定的关键字,从而避免 SeaJS 模块无法正常工作的问题。这样就可以确保 require 等关键字不会被混淆,同时达到压缩代码的效果。


UglifyJS.minify(_files,{mangle:{except : ['$', 'require', 'exports']}});

根据你的描述,UglifyJS.minify 方法在压缩 SeaJS 模块时会替换掉 require 等关键字。为了只排除特定的变量(如 $, require, exports),你可以使用 UglifyJS 的自定义配置来实现这一点。

以下是一个示例代码,展示了如何配置 UglifyJS.minify 方法以保留这些关键字:

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

const _files = '...'; // 这里放置你的源代码

const result = UglifyJS.minify(_files, {
  mangle: false,
  output: {
    comments: false
  },
  compress: {
    drop_console: true
  },
  toplevel: false,
  ie8: true,
  safari10: true,
  keep_fnames: true,
  reserved: ["$", "require", "exports"] // 这里指定保留的关键字
});

console.log(result.code);

解释:

  • mangle: false:关闭变量名混淆。
  • compress.drop_console: true:删除所有 console.* 语句。
  • reserved:这里指定保留的关键字,确保 "$", "require", "exports" 不被替换或混淆。

这样配置后,UglifyJS 将不会混淆或替换这些保留的关键字。希望这能解决你的问题!

回到顶部