OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

Node.JS的竞争对手?QuickJS入门教程,使用os模块读写文件,并将JavaScript编绎成可执行文件


分享到


分类 JS学习   关键字 Node.JS   发布 ourjs  1563241334223
注意 转载须保留原文链接,译文链接,作者译者等信息。  
QuickJS 是一个完全由C语言编写的极小型JavaScript引擎,支持跨平台运行,并且有一些Java的特质,可将JS直接编绎成二进制文件。内置的系统模块还可以直接读写文件,动态加载脚本。目前还不支持net模块,不过已经有人在pull request中提交了merge请求。不久将可以直接使用系统Socket或发送http请求,构建web服务器。

由于非常精简,而且拥有JavaScript的全部功能,开发效率和运行效率都相当不错,可以预见,QuickJS将是Node.JS在嵌入设备,尤其是低端设备上较强的竞争对手。

QuickJS直接调用C模块


使用QuickJS前先需要进行源码编绎, 参考:  在嵌入式设备树莓派上编译QuickJS教程:一个C语言编写的极简JavaScript引擎 

QuickJS可直接调用C语言写的模块,如下面的示例:

/* example of JS module importing a C module */

import { fib } from "./fib.so";

console.log("Hello World");
console.log("fib(10)=", fib(10));

因为使用了import,调用时需要先启用模块加载 -m 参数:

root@VM-168-37-debian:~/quickjs-2019-07-09# ./qjs -m examples/hello_module.js
> Hello World
> fib(10)= 55

QuickJS使用系统os模块


在node.js中os提供系统的一些接口比如芯片构架操作系统信息等,文件操作则在fs模块中。而在quickjs中则在os模块中提供一些操作系统的底层接口,比如文件读写。

我们先创建一个测试文件,内容为 testing:

echo testing >> test.txt

新建一个 os.js 的测试文件,

nano os.js

粘贴入代码:

var fd      = os.open('./test.txt')
var buffer  = new ArrayBuffer(1024)
var len     = os.read(fd, buffer, 0, 1024)

console.log(len)
console.log(String.fromCharCode.apply(null, new Uint8Array(buffer)))

由于fd读取的是ArrayBuffer,我们使用了Uint8Array先转换成了字符串。用qs运行:

root@VM-168-37-debian:~/quickjs-2019-07-09# ./qjs os.js
8
testing

编绎成可执行文件

QuickJS使用qjsc来将javascript 文件编绎成二进制文件,但这里可能有一个BUG调用时目前还无法调用系统模块。没有外部依赖的JS则没有这个问题,由此可见QuickJS还有一定的改善空间。

root@VM-168-37-debian:~/quickjs-2019-07-09# ./qjsc -o os os.js
root@VM-168-37-debian:~/quickjs-2019-07-09# ./os
ReferenceError: os is not defined
    at <eval> (os.js:1)

这里的例子使用的是同步代码,由于JavaScript是单线程的,同步代码可能会阻塞当前进程,QuickJS提供了 setReadHandler/setWriteHandler 疑似可以传入回调函数进行异步处理。


os module 目前的接口方法:

open(filename, flags, mode = 0o666)
close(fd)
seek(fd, offset, whence)
read(fd, buffer, offset, length)
write(fd, buffer, offset, length)
isatty(fd)
ttyGetWinSize(fd)
ttySetRaw(fd)
remove(filename)
rename(oldname, newname)
setReadHandler(fd, func)
setWriteHandler(fd, func)
signal(signal, func)
setTimeout(delay, func)
clearTimer(handle)


QuickJS项目地址: https://github.com/horhof/quickjs

评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. Node.JS用RSA签名算法公钥加密私钥解密,实现License软件授权验证
  2. Node.JS在命令行中检查Chrome浏览器是否安装,并打开指定网址
  3. 使用JavaScript的Proxy监听对象属性变化并进行类public/private的访问控制
  4. 树莓派4对比测试:性能提升3倍启动时间反而变慢?TF卡成最大瓶颈
  5. JavaScript求一个字符串的字节长度
  6. Node.JS借助OS模块获取当前Windows系统用户登录名
  7. GO有语法缺陷,缺少泛型、public/private、三元运算符?我不喜欢 Go 语言的十个理由
  8. 在嵌入式设备树莓派上编译QuickJS教程:一个C语言编写的极简JavaScript引擎
  9. Node.JS的竞争对手?QuickJS入门教程,使用os模块读写文件,并将JavaScript编绎成可执行文件
  10. 用 OnceAir 搭建个人Git/Svn/照片备份服务器,每年电费7块钱

 相关阅读 - JS学习
  1. 在嵌入式设备树莓派上编译QuickJS教程:一个C语言编写的极简JavaScript引擎
  2. Node.JS的竞争对手?QuickJS入门教程,使用os模块读写文件,并将JavaScript编绎成可执行文件
  3. 使用JavaScript的Proxy监听对象属性变化并进行类public/private的访问控制
  4. JavaScript求一个字符串的字节长度
  5. Node.JS用RSA签名算法公钥加密私钥解密,实现License软件授权验证
  6. Node.JS借助OS模块获取当前Windows系统用户登录名
  7. JavaScript中将字符串true或false转换成Boolean类型
  8. jQuery用$.prop,$.attr方法来获取或设置checkbox当前选中状态
  9. Node.JS中用concat和push连接两个或多个数组的性能比较
  10. 判断是否为对象typeof abc == 'object' 与 instanceof 性能比较

 关键字 - Node.JS
  1. Node.JS的竞争对手?QuickJS入门教程,使用os模块读写文件,并将JavaScript编绎成可执行文件
  2. Node.JS借助OS模块获取当前Windows系统用户登录名
  3. Node.JS用RSA签名算法公钥加密私钥解密,实现License软件授权验证
  4. Node.JS在命令行中检查Chrome浏览器是否安装,并打开指定网址
  5. node.js中将console.log日志内容输出到文件
  6. 告别Node.js
  7. 提高NodeJS网站的安全性:Web服务器防黑客攻击技巧
  8. Node.JS用Socket实现FTP Server服务器和Client客户端
  9. [译]Node.js 框架比较: Express vs. Koa vs. Hapi
  10. Express入门教程:一个简单的博客

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号