[英]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,所以你不会得到require
和export
函数。 对于包含 JavaScript 脚本,您可以使用 FreeSwitch include
或require
关键字 - 它们是相同的。 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.