需要/导入匿名函数而不导出

时间:2018-04-19 06:52:46

标签: javascript

我有一个带有单个匿名函数的js文件,没有导出或分配给module.exports。我无法更改此文件。但我需要能够测试它。如何将此文件导入/导入测试?

例如。

myScript.js(无法修改

/*
*  Documentation for function
*
*/
function (param1, cb) {
  cb(param1);
}

myScript.test.js

// How can I get this anonymous function here?
const myScript = require('./myScript');

已完成的一个选项是将myScript.js作为文件读取,删除注释并使用Function.apply将代码作为字符串。这感觉就像一个hacky方法,所以我正在寻找CommonJS等区域中是否有任何可以解决此限制的事情。

2 个答案:

答案 0 :(得分:0)

如果您使用的是webpack,则可以使用string-replace-loader来解决此问题。 这也很hacky,但更少:)

webpack.config.js

module.exports = {
    module: {
        rules: [
            {
                include: [path.resolve(__dirname, 'src')],
                loader: 'string-replace-loader',
                options: {
                    search: 'function (param1, cb)',
                    replace: 'module.exports.myfunc = function (param1, cb)',
                },
                test: /myScript\.js$/
            }
        ]
    }
}

src / index.js

var myScript = require("./myScript")
myScript.myfunc("myParam", (p)=>console.log("callback hit with param ", p));

cmd

$ webpack
$ node dist/main.js
callback hit with param  myParam

当然,如果要执行以下操作:

myScript=require('./myScript');
myScript(...)

在替换中使用此名称:module.exports = function (param1, cb)

答案 1 :(得分:0)

您可以这样做:

var fileContents;
//TODO: load in contents of your JS file here (no need to strip comments)

var expr = '(function(){ return ' + fileContents + '; })()';
module.exports = eval(expr);

顺便说一句,当您认为加载和评估文件内容是其最初的预期用途时,这并不是一个“ hack”。