2016-09-27 1 views
0

Everything works when I require a normal JavaScript file in Node:Wie benötige ich eine Zipped-JavaScript-Datei mit Node.js und zlib?

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

Aber jetzt habe ich die test.js Datei komprimiert, es als string Werke zu lesen:

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); 
}); 

Aber ich will keine string. Die Verwendung von eval scheint nicht richtig zu sein.

Wie kann ich die string als JavaScript ähnlich wie ich mit require ('test.js'); (Ich kann nicht auf externe Bibliotheken verwenden)

Antwort

1

Hier ist eine mögliche Implementierung:

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'); 
+0

Danke, aber ich kann externe Bibliotheken nicht für diese. – iwek

+0

@iwek Ich habe meine Antwort bearbeitet, um eine mögliche Implementierung bereitzustellen, die nicht auf externe Bibliotheken angewiesen ist. – robertklep

+0

Danke! fyi, ich musste "use strict" fallen lassen; oben als Knoten warf SyntaxError: Block-Bereich Deklarationen (let, const, Funktion, Klasse) noch nicht außerhalb des strikten Modus unterstützt – iwek