【问题标题】:Require/import anonymous function without an export需要/导入匿名函数而不导出
【发布时间】:2018-04-19 06:52:45
【问题描述】:

我有一个带有单个匿名函数的 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 作为文件读取,剥离cmets 并使用Function.apply 将代码作为字符串。这感觉像是一种 hacky 方法,所以我正在搜索 CommonJS 等区域中是否有任何东西可以解决这个限制。

【问题讨论】:

  • 这是一个真实的例子吗? 任何人如何调用这个函数(在这个文件内部或外部)?
  • 我认为通过文件外部执行该功能是不可能的
  • 这是一个真实世界的例子,这个脚本被一个系统使用,它将它作为一个字符串读取并在特定条件下执行它,就像一个插件系统。
  • 你不能执行这个函数,除非你把它存储在我猜的变量中,或者你使用trailing parentheses
  • 和你一样,不修改脚本(无论是在内存中还是在磁盘中),没有人可以使用该功能。

标签: javascript


【解决方案1】:

如果您使用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));

命令

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

当然如果你想这样执行:

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

在替换中使用这个:module.exports = function (param1, cb)

【讨论】:

    【解决方案2】:

    你可以这样做:

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-15
      • 2020-09-29
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      相关资源
      最近更新 更多