繁体   English   中英

在 freeswitch 脚本中使用 mod_v8 的 javascript 文件的需求究竟是如何工作的?

[英]How exactly works the require of javascript files with mod_v8 in freeswitch scripts?

我真的被困在这里了。 虽然 mod_lua 中模块的 require 似乎与 lua 解释器类似,但 mod_v8 中的 require() 似乎“包含”了整个脚本。 我还没有找到一种方法来使脚本中只导入我需要的模块(而不是节点模块)。

例如,在脚本中,我有一些如下所示:

//core/dtmf_1.js

const a = (arg) => { return arg * 2 }
const b = (arg) => { return arg / 2 }


//I get an error DONT WORKS
exports.a = a
exports.b = b

下面的示例对我也不起作用,但不会引发错误。

//core/dtmf_2.js

export function a = (arg) => { return arg * 2 }
export function b = (arg) => { return arg / 2 }

否则,当我打电话

//ivr.js
import a from 'core/dtmf_2.js' 

我在“导入”中遇到错误

但如果我只是这样做:

//core/dtmf_3.js
const function a = (arg) => { return arg * 2 }
const function b = (arg) => { return arg / 2 }
//ivr.js
require('core/dtmf_3.js')

console.log(b(30)) <-- WORKS! Outputs 15

我想知道 mod_v8 的 conf 中是否有一些设置允许导入模块。 我想这样做是因为我在我的库中预定义了不同的方法,但我很少通过服务使用多个方法。 谢谢指教。

FreeSwitch 使用 V8,而不是 Node.js,所以你不会得到requireexport函数。 对于包含 JavaScript 脚本,您可以使用 FreeSwitch includerequire关键字 - 它们是相同的。 Include将包含整个脚本,因此您不能执行类似下面的示例的操作,因为您正在加载 math.js 两次,因此会发生异常: SyntaxError: Identifier 'pi' has already been declared (near: "const pi = 3.14;") created SyntaxError: Identifier 'pi' has already been declared (near: "const pi = 3.14;")

数学.js

const pi = 3.14;

function circleArea(radius){
    return radius * radius * pi;
}

function sum(a, b){
    return a + b;
}

圆.js

include('/etc/freeswitch/test/math.js');

function getArea(radius){
    return circleArea(radius);
}

主文件

include('/etc/freeswitch/test/circle.js');
include('/etc/freeswitch/test/math.js');

//math.js
log( sum(5,10) );

//circle.js
log( getArea(10) );

将函数包含在变量中

include实现允许您将脚本中的代码“复制粘贴”到首先调用include脚本中,以便您可以利用它将代码加载到变量中。 例如:

数学.js

(a, b) => {
    return a + b;
}

主文件

const sum = include('/etc/freeswitch/test/math.js');

//logs 15
log( sum(5, 10) );

将自调用函数包含到变量中

现在,将相同的脚本加载到全局范围内不会出现问题。 我们可以使用自调用函数将其提升到另一个层次。

数学.js

(() => {

    const pi = 3.14;

    function circleArea(radius){
        return radius * radius * pi;
    }

    function sum(a, b){
        return a + b;
    }

    return { circleArea, sum };

})();

主文件

const math = include('/etc/freeswitch/test/math.js');
const { sum, circleArea } = include('/etc/freeswitch/test/math.js');

//with module
log( math.circleArea(5) ); // logs 78.5
log( math.sum(5, 10) );    // logs 15

//direct call
log( circleArea(5) );      // logs 78.5
log( sum(5, 10) );         // logs 15

但是每次你想加载 math.js 时,它都会作为它自己的模块,并且会加载多次,而不是像 Node.js 模块那样。 例如:

自由切换

数学.js

(() => {
    log("Math loaded...");
})();

主文件

const math1 = include('/etc/freeswitch/test/math.js');
const math2 = include('/etc/freeswitch/test/math.js');

这将打印“数学加载...”两次。

节点.js

数学.js

(() => {
    console.log("Math loaded...");
})();

主文件

const math1 = require('./math.js');
const math2 = require('./math.js');

这将打印一次“数学加载...”。

仅将自调用函数包含到变量中一次

从这里您可以编写自己的包含脚本(这仍然是不好的方法,但应该可以工作)。 像这样的东西:

包含.js

if (typeof _include === 'undefined') {

    var _loadedScripts = {};

    function _include(script){
        if (!_loadedScripts.hasOwnProperty(script)){
            _loadedScripts[script] = include(script);
        }
        return _loadedScripts[script];
    }

}

然后你可以像以前一样编写你的模块:

数学.js

(() => {

    log("Math loaded...");

    var pi = 3.14;

    return { pi };

})();

当您想包含脚本时:

主文件

include('/etc/freeswitch/include.js');

const math1 = _include('/etc/freeswitch/test/math.js');
const math2 = _include('/etc/freeswitch/test/math.js');

math1.pi = 10;
math2.pi = 20;

log(math1.pi);
log(math2.pi);

这将产生:

Math loaded...
20
20

[编辑]

Include.js是唯一没有作为“模块”加载的脚本,因此它将被加载多次。 您可以通过用您自己的替换默认包含功能来防止这种情况,您可以使用 require 代替包含功能。

包含.js

if (typeof _include === 'undefined') {

    var _loadedScripts = {};

    function _include(script){
        if (!_loadedScripts.hasOwnProperty(script)){
            _loadedScripts[script] = require(script);
        }
        return _loadedScripts[script];
    }

    include = () => {  };

}

现在,如果Include.js已经包含在内,则每次调用include("include.js") 时它都不会再次加载。

暂无
暂无

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

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