JXcore 打包
node.Js 是面向服务器端和网络应用程序的开源跨平台运行环境。JXcore 是一个支持多线程的节点。对于 js 发行版,您可以在多个线程中安全运行,而无需对现有代码进行任何更改。安装命令如下:
$ curl https://raw.githubusercontent.com/jxcore/jxcore/master/tools/jx_install.sh | bash
复制代码
包含以下文件:
drwxr-xr-x 2 root root 4096 Nov 13 12:42 images
-rwxr-xr-x 1 root root 30457 Mar 6 12:19 index.htm
-rwxr-xr-x 1 root root 30452 Mar 1 12:54 index.js
drwxr-xr-x 23 root root 4096 Jan 15 03:48 node_modules
drwxr-xr-x 2 root root 4096 Mar 21 06:10 scripts
drwxr-xr-x 2 root root 4096 Feb 15 11:56 style
复制代码
载入:使用 JXcore 编译后,我们可以使用以下命令执行生成的 jx 二进制文件:
$ node index.js command_line_arguments
复制代码
模块系统
node.js 文件相互调用,Node.js 提供了一个简单的模块系统。模块是一个节点。js 应用程序的基本组件、文件和模块是一对一的。换句话说,节点 js 文件是一个模块,可以是 JavaScript 代码、JSON 或编译的 C/C++扩展。
exports.world = function() {
console.log('Hello World');
}
复制代码
helloJs 通过 exports 对象将世界作为模块的访问接口 Js 通过 require('./hello')加载模块,然后可以直接访问 Js 中 exports 对象的成员函数 hello。有时我们只想将一个对象封装成以下格式的模块:
//hello.js
function Hello() {
var name;
this.setName = function(thyName) {
name = thyName;
};
this.sayHello = function() {
console.log('Hello ' + name);
};
};
module.exports = Hello;
复制代码
这样就可以直接获得这个对象了:
//main.js
var Hello = require('./hello');
hello = new Hello();
hello.setName('BYVoid');
hello.sayHello();
复制代码
模块接口中唯一的变化是使用模块 Exports=Hello 替换 exportsworld=function(){}当外部引用此模块时,其接口对象是要输出的 Hello 对象本身,而不是原始导出。
var http = require("http");
...
http.createServer(...);
复制代码
node.Js 附带一个名为 http 的模块。我们在代码中请求它,并将返回值分配给一个局部变量。这将我们的局部变量转换为一个对象,该对象包含 http 模块提供的所有公共方法。node.Js 的 require 方法中的文件搜索策略如下:因为节点 js 中有四种类型的模块(原生模块和三个文件模块)。尽管 require 方法非常简单,但内部加载非常复杂,并且它们的加载优先级不同。
LOAD_AS_DIRECTORY(X)
1. 如果 X/package.json 是一个文件,
a. 解析 X/package.json, 并查找 "main" 字段。
b. let M = X + (json main 字段)
c. LOAD_AS_FILE(M)
d. LOAD_INDEX(M)
2. LOAD_INDEX(X)
LOAD_NODE_MODULES(X, START)
1. let DIRS=NODE_MODULES_PATHS(START)
2. for each DIR in DIRS:
a. LOAD_AS_FILE(DIR/X)
b. LOAD_AS_DIRECTORY(DIR/X)
NODE_MODULES_PATHS(START)
1. let PARTS = path split(START)
2. let I = count of PARTS - 1
3. let DIRS = []
4. while I >= 0,
a. if PARTS[I] = "node_modules" CONTINUE
b. DIR = path join(PARTS[0 .. I] + "node_modules")
c. DIRS = DIRS + DIR
d. let I = I - 1
5. return DIRS
复制代码
net
在 UNIX 上,本地域也称为 UNIX 域。参数路径是文件系统路径名。它从 sizeof(sockaddr_un.sun_path)-1 被截断,其长度从 91 到 107 字节不等,具体取决于操作系统。Linux 上的典型值为 107,macOS 上为 103。路径受与创建的文件相同的命名约定和权限检查的约束。它将在文件系统中可见,并将持续到取消链接时。在 Windows 上,本地域通过命名管道实现。路径必须是?\Pipe 或\Pipe 是入口。路径允许任何字符,但以下字符可能会对管道名称进行某些处理,例如解析..Sequence。但是,管道空间是平坦的。管道不会持续,并且在关闭最后一个参照时将被删除。不要忘记在转义 JavaScript 字符串时使用双反斜杠来指定路径,
net.createServer().listen(
path.join('\\\\?\\pipe', process.cwd(), 'myctl'));
复制代码
server.address()如果在 IP 套接字上侦听,将返回操作系统报告的绑定 IP 地址、地址系列和服务端口。在查找操作系统分配的地址时,查找指定的端口非常有用。返回具有端口、系列和地址属性的对象:{port:12346,系列:“IPv4”,地址:“127.0.0.1”}对于侦听管道或 UNIX 域套接字的服务器,名称将作为字符串返回
const server = net.createServer((socket) => {
socket.end('goodbye\n');
}).on('error', (err) => {
// handle errors here
throw err;
});
// grab an arbitrary unused port.
server.listen(() => {
console.log('opened server on', server.address());
});
复制代码
停止服务器以接受和创建新连接并保留现有连接此功能是异步的。当所有连接都关闭并且服务器响应['close'][]事件时,服务器将最终关闭。一旦发生'close',将调用可选的回调函数。与此事件不同,如果服务器在关闭时未打开,则将使用错误作为唯一参数。
server.on('error', (e) => {
if (e.code === 'EADDRINUSE') {
console.log('Address in use, retrying...');
setTimeout(() => {
server.close();
server.listen(PORT, HOST);
}, 1000);
}
});
复制代码
所有 listen()方法都可以传入 backlog 参数,以指定要连接的队列的最大长度。
评论