【问题标题】:How to require or evaluate gzipped JavaScript file with Node.js and zlib?如何使用 Node.js 和 zlib 要求或评估 gzip 压缩的 JavaScript 文件?
【发布时间】:2016-09-27 13:52:28
【问题描述】:

当我在 Node 中需要一个普通的 JavaScript 文件时,一切正常:

var test = require('test.js');
console.log(test.foo); // prints the function

但现在我已经压缩了 test.js 文件,将其读取为 string 有效:

var fs = require('fs');
var zlib = require('zlib');

var gunzip = zlib.createGunzip();

var buffer = [];
fs.createReadStream('test.js.gz').pipe(gunzip);
gunzip.on('data', function(data){
  buffer.push(data.toString())
});
gunzip.on('finish', function(){
  console.log(buffer.join("")); //prints the JS file as string    
}).on("error", function(e) {
  console.log(e);
});

但是,我不想要string。使用eval 似乎不对。

如何将string 评估为类似于我使用 require('test.js'); (我不能使用外部库)

【问题讨论】:

    标签: node.js gzip require zlib


    【解决方案1】:

    这是一个可能的实现:

    const Module = require('module');
    const zlib   = require('zlib');
    const fs     = require('fs');
    
    function requireGZ(filename) {
      let code = zlib.gunzipSync(fs.readFileSync(filename)).toString();
      let mod  = new Module();
    
      mod._compile(code, filename);
    
      return mod.exports;
    }
    
    // Use:
    let test = requireGZ('./test.js.gz');
    

    【讨论】:

    • 谢谢,但我不能为此使用外部库。
    • @iwek 我已经编辑了我的答案以提供不依赖外部库的可能实现。
    • 谢谢!仅供参考,我不得不放弃“使用严格”;在节点抛出 SyntaxError 的顶部:在严格模式之外尚不支持块范围的声明(let、const、函数、类)
    • @iwek 是的,我用 Node v6 测试过 :)
    猜你喜欢
    • 2010-12-22
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多