当前位置:

首页 > 编程开发 > Luvit像Node.js一样写Lua应用

Luvit像Node.js一样写Lua应用

先问个问题:如果你是一个Lua开发者,手头刚好有异步I/O的需求,你会怎么办?传统方案当然有,但要说最接近Node.js体验的,还得是Luvit。简单来说,它就是Lua界的Node.js——把Lua和libUV撮合在一起,再加上JIT加持,用项目自己的话说:Lua + libUV + JIT = p

本文目录

    先问个问题:如果你是一个Lua开发者,手头刚好有异步I/O的需求,你会怎么办?传统方案当然有,但要说最接近Node.js体验的,还得是Luvit。简单来说,它就是Lua界的Node.js——把Lua和libUV撮合在一起,再加上JIT加持,用项目自己的话说:Lua + libUV + JIT = pu re awesomesauce。在Gitlab上,这段描述说得明明白白。

    概要信息

    安装

    官方提供了安装脚本,一键搞定,不过版本不一定最新。如果你非要追新,那就老老实实从源码编译吧。

    curl -L https://github.com/luvit/lit/raw/master/get-lit.sh | sh

    安装日志

    [root@kong ~]# curl -L https://github.com/luvit/lit/raw/master/get-lit.sh | sh
     % Total  % Received % Xferd A verage Speed  Time  Time   Time Current
                     Dload Upload  Total  Spent  Left Speed
    100  127 100  127  0   0   57   0 0:00:02 0:00:02 --:--:--  57
    100  567 100  567  0   0  192   0 0:00:02 0:00:02 --:--:-- 1788
    Downloading https://github.com/luvit/luvi/releases/download/v2.7.6/luvi-regular-Linux_x86_64 to luvi
     % Total  % Received % Xferd A verage Speed  Time  Time   Time Current
                     Dload Upload  Total  Spent  Left Speed
    100  615  0  615  0   0  280   0 --:--:-- 0:00:02 --:--:--  280
    100 4261k 100 4261k  0   0  481k   0 0:00:08 0:00:08 --:--:-- 1007k
    Downloading https://lit.luvit.io/packages/luvit/lit/v3.5.4.zip to lit.zip
     % Total  % Received % Xferd A verage Speed  Time  Time   Time Current
                     Dload Upload  Total  Spent  Left Speed
    100 234k 100 234k  0   0 91459   0 0:00:02 0:00:02 --:--:-- 91488
    lit version: 3.5.4
    luvi version: v2.7.6
    command: make lit.zip lit luvi
    create config: /root/.litconfig
    compiling filter: ** excludes by default (first rule is positive)
    including: commands/README
    including: commands/add.lua
    including: commands/auth.lua
    including: commands/claim.lua
    including: commands/config.lua
    including: commands/down.lua
    including: commands/get-luvi.lua
    including: commands/help.lua
    including: commands/init.lua
    including: commands/install.lua
    including: commands/ls.lua
    including: commands/make.lua
    including: commands/publish.lua
    including: commands/serve.lua
    including: commands/share.lua
    including: commands/sync.lua
    including: commands/unclaim.lua
    including: commands/up.lua
    including: commands/update.lua
    including: init.lua
    including: libs/api.lua
    including: libs/auto-updater.lua
    including: libs/autoconfig.lua
    including: libs/calculate-deps.lua
    including: libs/codec.lua
    including: libs/core.lua
    including: libs/db-fs.lua
    including: libs/db.lua
    including: libs/exec.lua
    including: libs/export-zip.lua
    including: libs/export.lua
    including: libs/get-installed.lua
    including: libs/github-request.lua
    including: libs/handlers.lua
    including: libs/import.lua
    including: libs/install-deps.lua
    including: libs/log.lua
    including: libs/metrics.lua
    including: libs/pkg.lua
    including: libs/rdb.lua
    including: libs/rules.lua
    including: libs/snapshots.lua
    including: libs/stats.lua
    including: libs/verify-signature.lua
    including: libs/vfs.lua
    including: luvit-loader.lua
    including: main.lua
    including: package.lua
    including dependency: base64 (deps/base64.lua)
    including dependency: coro-channel (deps/coro-channel.lua)
    including dependency: coro-fs (deps/coro-fs.lua)
    including dependency: coro-http (deps/coro-http.lua)
    including dependency: coro-net (deps/coro-net.lua)
    including dependency: coro-spawn (deps/coro-spawn.lua)
    including dependency: coro-split (deps/coro-split.lua)
    including dependency: coro-websocket (deps/coro-websocket.lua)
    including dependency: coro-wrapper (deps/coro-wrapper.lua)
    including dependency: git (deps/git/)
    including dependency: http-codec (deps/http-codec.lua)
    including dependency: json (deps/json.lua)
    including dependency: md5 (deps/md5.lua)
    including dependency: pathjoin (deps/pathjoin.lua)
    including dependency: pretty-print (deps/pretty-print.lua)
    including dependency: prompt (deps/prompt.lua)
    including dependency: querystring (deps/querystring.lua)
    including dependency: readline (deps/readline.lua)
    including dependency: resource (deps/resource.lua)
    including dependency: secure-socket (deps/secure-socket/)
    including dependency: semver (deps/semver.lua)
    including dependency: sha1 (deps/sha1.lua)
    including dependency: ssh-rsa (deps/ssh-rsa.lua)
    including dependency: ustring (deps/ustring.lua)
    including dependency: weblit-app (deps/weblit-app.lua)
    including dependency: weblit-auto-headers (deps/weblit-auto-headers.lua)
    including dependency: weblit-websocket (deps/weblit-websocket.lua)
    including dependency: websocket-codec (deps/websocket-codec.lua)
    compiling filter: deps/git/** excludes by default (first rule is positive)
    including: core.lua
    including: db.lua
    including: init.lua
    including: package.lua
    including: storage.lua
    creating binary: /root/lit
    using luvi from: /root/luvi
    inserting luvi: /root/luvi
    storing: commands/add.lua
    compiling: commands/auth.lua (9.9% reduction)
    storing: commands/claim.lua
    storing: commands/config.lua
    storing: commands/down.lua
    compiling: commands/get-luvi.lua (20.7% reduction)
    storing: commands/help.lua
    compiling: commands/init.lua (14.9% reduction)
    storing: commands/install.lua
    compiling: commands/ls.lua (2.6% reduction)
    storing: commands/make.lua
    storing: commands/publish.lua
    compiling: commands/serve.lua (19% reduction)
    storing: commands/share.lua
    storing: commands/sync.lua
    storing: commands/unclaim.lua
    storing: commands/up.lua
    compiling: commands/update.lua (23.3% reduction)
    compiling: deps/base64.lua (29.2% reduction)
    compiling: deps/coro-channel.lua (19.7% reduction)
    storing: deps/coro-fs.lua
    compiling: deps/coro-http.lua (30.4% reduction)
    compiling: deps/coro-net.lua (18.5% reduction)
    compiling: deps/coro-spawn.lua (44% reduction)
    compiling: deps/coro-websocket.lua (34.6% reduction)
    compiling: deps/coro-wrapper.lua (66.1% reduction)
    compiling: deps/git/core.lua (3.4% reduction)
    compiling: deps/git/db.lua (18.7% reduction)
    storing: deps/git/init.lua
    storing: deps/git/package.lua
    compiling: deps/git/storage.lua (34.5% reduction)
    compiling: deps/http-codec.lua (37.2% reduction)
    compiling: deps/json.lua (30.7% reduction)
    storing: deps/md5.lua
    compiling: deps/pathjoin.lua (33.5% reduction)
    compiling: deps/pretty-print.lua (30.4% reduction)
    compiling: deps/prompt.lua (43.4% reduction)
    compiling: deps/querystring.lua (35.9% reduction)
    compiling: deps/readline.lua (18.6% reduction)
    compiling: deps/resource.lua (31.5% reduction)
    compiling: deps/secure-socket/biowrap.lua (31.8% reduction)
    compiling: deps/secure-socket/context.lua (27.4% reduction)
    compiling: deps/secure-socket/init.lua (52.5% reduction)
    storing: deps/secure-socket/package.lua
    compiling: deps/semver.lua (28.2% reduction)
    compiling: deps/sha1.lua (27.9% reduction)
    compiling: deps/ssh-rsa.lua (16.2% reduction)
    compiling: deps/ustring.lua (37.1% reduction)
    compiling: deps/weblit-app.lua (14.8% reduction)
    compiling: deps/weblit-auto-headers.lua (50.9% reduction)
    compiling: deps/weblit-websocket.lua (35.8% reduction)
    compiling: deps/websocket-codec.lua (18.2% reduction)
    storing: init.lua
    compiling: libs/api.lua (30.9% reduction)
    compiling: libs/auto-updater.lua (29% reduction)
    compiling: libs/autoconfig.lua (32.3% reduction)
    compiling: libs/calculate-deps.lua (30.4% reduction)
    compiling: libs/codec.lua (31.2% reduction)
    compiling: libs/core.lua (14% reduction)
    compiling: libs/db-fs.lua (29.5% reduction)
    compiling: libs/db.lua (38.2% reduction)
    compiling: libs/exec.lua (45.1% reduction)
    compiling: libs/export-zip.lua (36.4% reduction)
    compiling: libs/export.lua (36.6% reduction)
    compiling: libs/get-installed.lua (45.9% reduction)
    compiling: libs/github-request.lua (49.8% reduction)
    compiling: libs/handlers.lua (18.1% reduction)
    compiling: libs/import.lua (27.6% reduction)
    compiling: libs/install-deps.lua (38.4% reduction)
    compiling: libs/log.lua (60.7% reduction)
    compiling: libs/metrics.lua (56.8% reduction)
    compiling: libs/pkg.lua (36.9% reduction)
    compiling: libs/rdb.lua (22.2% reduction)
    compiling: libs/rules.lua (29.7% reduction)
    compiling: libs/snapshots.lua (12.6% reduction)
    compiling: libs/stats.lua (1.5% reduction)
    compiling: libs/verify-signature.lua (40.8% reduction)
    compiling: libs/vfs.lua (29.9% reduction)
    compiling: luvit-loader.lua (29.8% reduction)
    compiling: main.lua (24.3% reduction)
    compiling: package.lua (14.8% reduction)
    done building: /root/lit
    done: success
    lit version: 3.5.4
    luvi version: v2.7.6
    command: make lit://luvit/luvit luvit luvi
    load config: /root/.litconfig
    connecting: wss://lit.luvit.io/
    fetching: 1 object
    fetching: 1 object
    fetching: 4 objects
    using snapshot: ab0b6ace5a16a88e6fbb4c8da0083c40cf1d6803
    creating binary: /root/luvit
    using luvi from: /root/luvi
    fetching: 1 object
    fetching: 1 object
    fetching: 27 objects
    fetching: 16 objects
    inserting luvi: /root/luvi
    compiling: deps/buffer.lua (16.5% reduction)
    compiling: deps/childprocess.lua (19.1% reduction)
    compiling: deps/codec.lua (35.3% reduction)
    compiling: deps/core.lua (57.3% reduction)
    compiling: deps/dgram.lua (25.5% reduction)
    compiling: deps/dns.lua (25.1% reduction)
    compiling: deps/fs.lua (6.2% reduction)
    compiling: deps/helpful.lua (42.7% reduction)
    compiling: deps/hooks.lua (83.3% reduction)
    compiling: deps/http-codec.lua (37.4% reduction)
    compiling: deps/http-header.lua (59.4% reduction)
    compiling: deps/http.lua (29.6% reduction)
    compiling: deps/https.lua (45.6% reduction)
    compiling: deps/json.lua (30.7% reduction)
    compiling: deps/los.lua (76.9% reduction)
    compiling: deps/net.lua (13.9% reduction)
    compiling: deps/path/base.lua (24.9% reduction)
    compiling: deps/path/init.lua (49.7% reduction)
    storing: deps/path/package.lua
    compiling: deps/pathjoin.lua (33.5% reduction)
    compiling: deps/pretty-print.lua (30.6% reduction)
    compiling: deps/process.lua (17.2% reduction)
    compiling: deps/querystring.lua (35.9% reduction)
    compiling: deps/readline.lua (18.6% reduction)
    compiling: deps/repl.lua (28.2% reduction)
    compiling: deps/require.lua (24.6% reduction)
    compiling: deps/resource.lua (31.5% reduction)
    compiling: deps/stream/init.lua (55.6% reduction)
    storing: deps/stream/package.lua
    compiling: deps/stream/stream_core.lua (38.5% reduction)
    compiling: deps/stream/stream_duplex.lua (49.7% reduction)
    compiling: deps/stream/stream_observable.lua (50.8% reduction)
    compiling: deps/stream/stream_passthrough.lua (65.3% reduction)
    compiling: deps/stream/stream_readable.lua (48.2% reduction)
    compiling: deps/stream/stream_transform.lua (62% reduction)
    compiling: deps/stream/stream_writable.lua (43% reduction)
    compiling: deps/thread.lua (38.6% reduction)
    compiling: deps/timer.lua (24% reduction)
    compiling: deps/tls/common.lua (14.9% reduction)
    compiling: deps/tls/init.lua (26.1% reduction)
    compiling: deps/tls/lcrypto.lua (46.8% reduction)
    compiling: deps/tls/package.lua (2.6% reduction)
    compiling: deps/url.lua (32.8% reduction)
    compiling: deps/ustring.lua (37.5% reduction)
    compiling: deps/utils.lua (39.7% reduction)
    compiling: init.lua (43.5% reduction)
    compiling: main.lua (21.6% reduction)
    compiling: package.lua (21.1% reduction)
    storing: test.lua
    done building: /root/luvit
    done: success
    [root@kong ~]#

    安装结果确认

    [root@kong ~]# ./lit --version
    lit version: 3.5.4
    luvi version: v2.7.6
    [root@kong ~]# ./luvi --version
    ./luvi v2.7.6
    rex: 8.37 2015-04-28
    libuv: 1.9.1
    ssl: OpenSSL 1.0.2h 3 May 2016, lua-openssl 0.5.1
    [root@kong ~]# ./luvit --version
    luvit version: 2.14.2
    luvi version: v2.7.6
    rex version: 8.37 2015-04-28
    libuv version: 1.9.1
    ssl version: OpenSSL 1.0.2h 3 May 2016, lua-openssl 0.5.1
    [root@kong ~]#

    拷贝至PATH搜索目录

    [root@kong ~]# cp lit /usr/local/bin
    [root@kong ~]# cp luvi /usr/local/bin
    [root@kong ~]# cp luvit /usr/local/bin
    [root@kong ~]# 
    [root@kong ~]# which luvi
    /usr/local/bin/luvi
    [root@kong ~]# which lit
    /usr/local/bin/lit
    [root@kong ~]# which luvit
    /usr/local/bin/luvit
    [root@kong ~]#

    Lua界的Node.js

    看完安装,来看看它到底有多像Node.js。一个标准的Node.js HelloWorld是这样的:

    var http = require('http');
    http.createServer(function (req, res) {
     var body = 'Hello worldn';
     res.setHeader('Content-Type', 'text/plain');
     res.setHeader('Content-Length', body.length);
     res.end(body);
    }).listen(1337, '127.0.0.1');
    console.log('Server running at http://127.0.0.1:1337/');

    而Luvit的版本几乎就是一模一样的翻译:

    [root@kong ~]# cat server.lua 
    local http = require('http')
    http.createServer(function (req, res)
     local body = 'Hello worldn'
     res:setHeader('Content-Type', 'text/plain')
     res:setHeader("Content-Length", #body)
     res:finish(body)
    end):listen(1337, '127.0.0.1')
    print('Server running at http://127.0.0.1:1337/')
    [root@kong ~]#

    运行结果为:

    [root@kong ~]# luvit server.lua
    Server running at http://127.0.0.1:1337/

    确认结果:

    [root@kong ~]# curl http://localhost:1337
    Hello world
    [root@kong ~]#

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    编程语言的编程模型
    编程语言的编程模型

    编程模型涵盖面向过程的C语言、面向对象的Ruby、基于栈的PostScript、基于规则的Prolog、基于原型的Lua、函数式的Erlang/Haskell及混合模型的Scala/Clojure。类型系统区分强类型与弱类型、动态类型与静态类型,元编程允许运行时操作代码,提升表达力。

    lua 如何获取指定路径下的所有文件夹
    lua 如何获取指定路径下的所有文件夹

    Lua编程语言轻量级且小巧,可用io.popen执行系统命令获取指定路径下所有文件夹:在Windows系统下使用dir/b/s命令,在Unix系统下使用find-typef命令。然而官方更推荐使用lfs库进行递归遍历,通过lfs.dir和lfs.attributes函数筛选目录,此法避免系统命令依赖,代码简洁且跨平台效果更佳。

    lua调用C/C++的方法详解
    lua调用C/C++的方法详解

    Lua通过虚拟栈与C/C++交互,将C函数封装为接口供其调用。调用时,C从栈中获取参数并返回结果,参数传递与结果返回均通过栈操作完成,从而实现了Lua对C能力的高效、便捷调用,使得Lua能无缝利用C语言的高性能库。

    详解Lua中的元表和元方法
    详解Lua中的元表和元方法

    一、元表 元表是Lua中一个挺有意思的机制——它允许我们在一个值遇到未知操作时,给出自定义的行为。本质上,元表也是用table来承载的,所以熟悉了table,也就掌握了元表的基本用法。 不过得注意,元表只能针对一组预先定义好的操作集合做扩展,比面向对象中的类要受限得多。最典型的一点:元表不支持继承。

    如何使用Vim搭建Lua开发环境详解
    如何使用Vim搭建Lua开发环境详解

    基于SpaceVim搭建Lua开发环境,需先安装Neovim、Nerd字体及支持真色的终端,启用lang#lua模块后,即可获得全面的代码补全、语法检查、工程文件跳转、一键运行、代码格式化及交互式编程等高效开发功能,大幅提升编程效率与体验。

    Lua流程控制语句if else的使用示例
    Lua流程控制语句if else的使用示例

    Lua的流程控制,if和if else是基础。和C语言很像,if语句支持嵌套,也能和循环配合——比如在循环体内根据条件决定是否跳出,这在日常开发中非常实用。 1、if语句 先看最基本的if语法结构: if(布尔表达式) then --[ 在布尔表达式为 true 时执行的语句 --] end 来看一

    Lua中pairs与ipairs的区别总结
    Lua中pairs与ipairs的区别总结

    最近在写一个流量转发的东西,用到了 nginx_lua_module 这个模块,需要根据 Header、Body 和 Cookie,按照流量比例把请求转发到其他地方。翻看前人留下的代码,发现循环遍历时,有时候用 pairs,有时候用 ipairs,风格并不统一,读起来让人有点困惑。 好在 Lua 官

    Lua游戏开发教程之时区问题详解
    Lua游戏开发教程之时区问题详解

    通过Lua的os.date("!*t")获取UTC时间,结合服务器时区差值,可将游戏内时间统一显示为服务器所在地时间。计算活动倒计时时,需考虑本地时区与服务器时区的差异,转换时间戳后得到准确剩余时间。正确处理时区问题能解决多语种发行中的显示同步难题。

    深入谈谈lua中神奇的table
    深入谈谈lua中神奇的table

    Lua中的table可作为字典、数组、环境、模块、对象和类使用。字典支持任意非nil键类型,遍历无序;数组索引从1开始,#对空洞处理需谨慎。table掌管全局环境_G和局部环境_ENV,模块本质为table。对象通过闭包实现私有成员,冒号语法糖简化self传递;类借助元表__index实现继承。

    利用Lua定制Redis命令的方法详解
    利用Lua定制Redis命令的方法详解

    Redis单线程但多客户端无同步导致数据冲突,网络往返也制约效率。通过内嵌Lua脚本可将多个命令复合执行,实现原子操作并减少请求次数。需注意脚本中避免全局变量、控制耗时,且报错时已执行命令无法回滚。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。