🔬
OpenResty 最佳实践
  • 序
  • 入门篇
  • Lua 入门
    • Lua 简介
    • Lua 环境搭建
    • Lua 编辑器选择
    • 基础数据类型
    • 表达式
    • 控制结构
      • if/else
      • while
      • repeat
      • for
      • break,return 和 goto
    • Lua 函数
      • 函数的定义
      • 函数的参数
      • 函数返回值
      • 全动态函数调用
    • 模块
    • String 库
    • Table 库
    • 日期时间函数
    • 数学库函数
    • 文件操作
  • Lua 高阶
    • 元表
    • 面向对象编程
    • 局部变量
    • 判断数组大小
    • 非空判断
    • 正则表达式
    • 虚变量
    • 抵制使用 module() 定义模块
    • 调用代码前先定义函数
    • 点号与冒号操作符的区别
    • module 是邪恶的
    • FFI
    • 什么是 JIT
  • Nginx
    • Nginx 新手起步
    • location 匹配规则
    • 静态文件服务
    • 日志
    • 反向代理
    • 负载均衡
    • 陷阱和常见错误
  • OpenResty
    • 环境搭建
      • Windows 平台
      • CentOS 平台
      • Ubuntu 平台
      • Mac OS X 平台
    • Hello World
    • 与其他 location 配合
    • 获取 uri 参数
    • 获取请求 body
    • 输出响应体
    • 日志输出
    • 简单 API Server 框架
    • 使用 Nginx 内置绑定变量
    • 子查询
    • 不同阶段共享变量
    • 防止 SQL 注入
    • 如何发起新 HTTP 请求
    • 如何完成 bit 操作
      • 一,复习二进制补码
      • 二,复习位运算
      • 三,LuaJIT 和 Lua BitOp Api
      • 四,位运算算法实例
      • 五,Lua BitOp 的安装
  • LuaRestyRedisLibrary
    • 访问有授权验证的 Redis
    • select+set_keepalive 组合操作引起的数据读写错误
    • redis 接口的二次封装(简化建连、拆连等细节)
    • redis 接口的二次封装(发布订阅)
    • pipeline 压缩请求数量
    • script 压缩复杂请求
    • 动态生成的 lua-resty-redis 模块方法
  • LuaCjsonLibrary
    • json 解析的异常捕获
    • 稀疏数组
    • 空 table 编码为 array 还是 object
  • PostgresNginxModule
    • 调用方式简介
    • 不支持事务
    • 超时
    • 健康监测
    • SQL 注入
  • LuaNginxModule
    • 执行阶段概念
    • 正确的记录日志
    • 热装载代码
    • 阻塞操作
    • 缓存
    • sleep
    • 定时任务
    • 禁止某些终端访问
    • 请求返回后继续执行
    • 调试
    • 请求中断后的处理
    • 我的 lua 代码需要调优么
    • 变量的共享范围
    • 动态限速
    • shared.dict 非队列性质
    • 正确使用长链接
    • 如何引用第三方 resty 库
    • 典型应用场景
    • 怎样理解 cosocket
    • 如何安全启动唯一实例的 timer
    • 如何正确的解析域名
  • LuaRestyDNSLibrary
    • 使用动态 DNS 来完成 HTTP 请求
  • LuaRestyLock
    • 缓存失效风暴
  • OpenResty 与 SSL
    • HTTPS 时代
    • 动态加载证书和 OCSP stapling
    • TLS session resumption
  • 测试
    • 代码静态分析
    • 单元测试
    • 代码覆盖率
    • API 测试
    • 性能测试
    • 持续集成
    • 灰度发布
      • 分流引擎设计
      • 控制台开发
      • 向运维平台发展
  • Web 服务
    • API 的设计
    • 数据合法性检测
    • 协议无痛升级
    • 代码规范
    • 连接池
    • C10K 编程
    • TIME_WAIT 问题
    • 与 Docker 使用的网络瓶颈
  • 火焰图
    • 什么是火焰图
    • 什么时候使用
    • 如何安装火焰图生成工具
    • 如何定位问题
    • 拓展阅读
    • FAQ
Powered by GitBook
On this page
  • VS Code
  • 为什么选择 VS Code?
  • 下载 VS Code 并配置
  • 推荐插件
  • 使用技巧
  • IDEA
  • 下载 IDEA 并配置
  • 插件基本用法
  • 进阶配置
Edit on GitHub
  1. Lua 入门

Lua 编辑器选择

一个好用趁手的编辑器可以为我们带来极大的工作效率提升,Lua 本身并不挑编辑器,程序文件只是一个纯文本。 但是如果能有代码提示,方便的 goto 跳转,在我们理解别人的代码效率上将会有极大的提升。

我从最初的记事本编辑,vi,到后来的 UE 自定义语法高亮和函数列表,以及 scite 等,寻找和尝试过能找到的绝大部分的 Lua 编辑器。 我想在编辑器选择上面 (Linux 下的不熟= =) 应该比较有发言权。 这里我主要讲我的环境是如何配置的。

VS Code

VSCode(Visual Studio Code) 是一个号称“重新定义代码编辑”的可到处运行(跨平台)的开源软件。它同时支持 Windows、Linux、Mac 等平台,通过丰富的插件扩展器功能,当然最重要的是,它完全免费!

为什么选择 VS Code?

免费免费的里面,虽然有很多好用的,但是各有缺点:

  • Win 的 Notepad++:性能强,功能多,但颜值不高,也不支持其他平台

  • Sublime:颜值高,但是功能总体上算一般

  • Atom:功能一般,有一定用户量

  • Eclipse 家族:功能强,支持插件扩展,但太臃肿,性能差,其次 Lua 和 Openresty 插件比较弱

收费里面,有很多很强的,比如 JetBrains

因此,VS Code 诞生了:不仅好用,还免费!VS Code 该有的都有了包括很多不支持的或者功能不够完善的,比如:

  • 列模式包括很多(如 Sublime,Atom 等)

  • 文件编码(检测和转换)、全局和当前文件的搜索、搜索支持正则功能

  • 支持插件扩展。理论上:功能可无限增加,随便列举几个常用的好用的:Markdown Preview Enhancedindent-rainbowBracket Pair ColorizerPaste Image

  • 性能好。使用 Notepad++打开几百 M 或者更大的大文件的人,知道我在说什么;VSCode 打开大文件,秒开,即便开多个窗口,依旧非常流畅

下载 VS Code 并配置

傻瓜式一键安装,无需任何配置

推荐插件

Openresty 开发者推荐 EmmyLua 插件

Lua 开发者(通常是游戏开发者)推荐 Lua Helper 插件

使用技巧

使用插件格式化代码

代码格式化是一个无聊但又重要的工作,我们通常会使用专门的格式化工具来格式化代码(比如 golang 中的go fmt,或者 lua 的lua-format工具)。在 VS Code 平台,我们可以使用Lua Helper 插件内置的代码格式化工具来格式化 Lua 代码。

具体流程如下:

  1. 安装插件,参考前面的安装流程

  2. 打开 VS Code 命令面板。左上角查看->命令面板,Windows 快捷键Ctrl+Shift+P,Mac 快捷键Command+Shift+P。

  1. 搜索关键字format,选择格式化文档/Format Document即可

IDEA

本章节讲解如何在你自己的 Windows 上配置好 IDE。

下载 IDEA 并配置

IDEA 是一个在 Java 语言开发者中广受好评的编辑器,但是并不是只支持 Java。

其中 Community 版本是免费的,下载完后双击安装即可。

安装完成后打开 File->Settings->Plugins 在其中输入 Emmylua 点击右边的 install 安装并重启 IDEA。

新建一个 Lua 项目 在 File->Project Structure 里面配置好 modules 和 lib,如下图。

至此一个包含 Lua 语法提示和调试的编辑器环境就配置好了。

插件基本用法

1. 方法提示

你可以在 Setting 里面配置鼠标移动到方法上之后,自动弹出其相关说明的延迟时间

2. 快速跳转

在任何已经被定义的方法上按住 Ctrl+鼠标点击该方法就可以自动打开和跳转到方法定义上面,非常方便。

3. 方法提示

在你输入识别的全局或者局部变量上面按点会自动出现可选方法作为提示,不用记住所有的方法。

进阶配置

下面是一个简单的库函数定义示例:

---语法:pid = ngx.worker.pid()
---
---语法:set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, init_by_lua*, init_worker_by_lua*
---
---这个函数返回一个 Lua 数字,它是当前 Nginx 工作进程的进程 ID (PID)。 这个 API 比 ngx.var.pid 更有效,ngx.var.VARIABLE API 不能使用的地方(例如 init_worker_by_lua),该 API 是可以的。
---@return number
function ngx.worker.pid()
end

总之,如果你的库都定义好了方法提示,在你理解源码的时候将会非常方便快速。 相信我。

PreviousLua 环境搭建Next基础数据类型

Last updated 2 years ago

在官网下载即可:

目前通过开放的插件机制已经支持绝大部分语言且非常地好用顺手,相信使用过的都会有深切感受的。

有关 Emmylua 的详细帮助文档请看

也可以按 Ctrl+q 手动弹出,效果如下 (= =目前我使用的版本文档中的换行显示还有问题)

由于 Emmylua 并没有自带 OpenResty 的库函数,所以我们需要自己写函数提示,这里我提供自己写的供你们 和丰富。 请使用“右键-->另存为”方式下载,然后丢到你的 lualib 根目录中。

方法提示不一定要使用独立的文件定义,可以直接在库里面定义,如:

至于里面的含义就要去 看和理解啦。

下载链接
下载地址
这里
下载
这里