繁体   English   中英

需要/导入匿名功能而不导出

[英]Require/import anonymous function without an export

我有一个带有单个匿名函数的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和代码作为字符串。 这感觉像是一种骇人听闻的方法,因此我正在搜索以查看CommonJS等区域中是否有任何可以解决此限制的问题。

如果您使用的是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(...)

在replace: module.exports = function (param1, cb)

您可以这样做:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM