[英]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.