基础工作流
这篇文章会简述 Malagu 应用开发的工作流,让开发者可以非常方便地运行、调试、构建、调试、部署。
运行应用
在 Node.js 领域,怎么运行应用,方式五花八门。这是优势,同时也是劣势。
优势是说明 Node.js 足够灵活;劣势是开发者需要学得更多。Malagu 希望能提供一种抽象,这种抽象足够灵活,且又是统一的。这就是 Malagu 命令行工具的职责。
后面,我们会发现应用的生命周期中的各个阶段都会有 Malagu 命令行工具的身影。对于一个 Malagu 项目,我们可以通过 malagu serve 命令本地运行项目,malagu serve 命令如下:
Usage: malagu serve [options] [entry]
serve a application
Options:
-p, --port [port] port used by the server
-o, --open [open] open browser
-h, --help display help for command
命令参数
entry
:应用入口文件,可选,一般不需要指定,框架根据当前项目组件依赖情况自动选择合适的应用入口文件。
命令选项
-o,--open
:启动完成后自动打开浏览器访问应用服务地址,可选,默认不打开浏览器-p,--port
:应用服务启动的端口号,可选,默认3000
;除了命令行选项可以指定以外,我们还可以通过组件属性文件(malagu.yml
)配置,或者环境变量
-t,--targets
:应用构建目标产物,可选,默认值是['frontend', 'backend']
-m,--mode
:应用运行模式,可选,框架根据指定模式加载对应的模式配置件,本命令默认开启local
模式
命令示例
# 指定端口号和打开浏览器
$ malagu serve -p 3001
# 指定应用构建目标产物
$ malagu serve -t frontend
# 指定单个应用运行模式
$ malagu serve -m test
# 指定多个应用运行模式
$ malagu serve -m cdn,database # 或者 malagu serve -m cdn -m database
Malagu 运行命令支持 HMR 热替换
,无论是前端还是后端代码都支持。
Malagu 的一个设计是想统一前后端的开发模式,不仅仅是语言、组件、代码风格,还包括了一系列前后端技术栈。
调试应用
Malagu 的应用调试方式与其他普通类型的应用是一样的。
接下来,将以 VSCode 编辑器为示例。VSCode 是目前最为流行的代码编辑器,它提供很多方式用于 Node.js 项目调试:
- 通过
launch.json
文件配置调试方式。 - 直接在
Javascript Debug Terminal
上运行。
上述两种方式,Malagu 应用都支持,我们直接 malagu init
初始化模版中已经内置了开箱即用的 launch.json
文件(位于.vscode/launch.json
)。
构建应用
在大多数情况下,我们无需手动构建应用。因为我们在使用部署
命令的时候,会自动构建应用。我们也可以通过 malagu deploy --skip-build
跳过构建阶段。通过如下命令进行手动构建:
malagu build
另外,当我们想部署到框架未曾适配的托管平台,可以通过malagu build
自行手动构建。然后把构建产物自行打包上传部署。
构建产物默认位置为:[项目更目录]/.malagu/dist
。虽然支持自定义,但是大部分情况,不推荐自定义。
Malagu 框架是通用型应用开发框架,支持前端和后端应用。在构建的时候,Malagu 工具根据属性配置或者命令选项 targets
来控制构建的目标产物,targets
支持配置多个构建目标。目前,targets 支持 frontend
和 backend
。
通过命令选项指定构建目标:
malagu build -t backend # 或者 malagu build --targets backend
通过配置文件指定构建目标:
# malagu.yml
targets: [backend]
当都没有指定的情况下,targets 默认值为 [frontend, backend]
。
mode
来解决。我们可以简单理解模式是一种功能开关,通过模式激活不同的功能,所以很自然想到模式支持多个,可以任意组合
。模式支持属性配置和命令选项两种模式,如果两种方式都指定,则模式会附加在一起生效。因此,我们既可以通过命令选项
指定构建模式:
# 构建为传统服务器部署产物
malagu build -m server
# 构建为腾讯云云函数部署产物
malagu build -m scf
# 构建为阿里云函数计算部署产物
malagu build -m fc
# 构建为 AWS Lambda 部署产物
malagu build -m lambda
# 构建为用户自定义的构建产物
malagu build -m xxxx
也可以通过malagu.yml
指定构建模式:
# malagu.yml
mode: [scf]
模式不仅仅构建阶段会用到,随着我们深入了解 Malagu,会发现模式是 Malagu 的一个非常核心的设计要素,几乎无处不在,通过模式提升了框架整体的灵活些,让框架的能力以模式的方式组合使用。
当 Malagu 工具默认提供的构建能力不满足我们的构建需求时,我们可以通过 Malagu 工具提供的扩展点:Build Hook 进行自定义。
我们提供一个开箱即用的插件,通过 Build Hook 自行实现构建逻辑。Malagu 工具自身提供的默认构建逻辑,也是基于扩展点 Build Hook 实现。Malagu 使用该扩展点,理论上可以实现任意第三方框架应用的构建与部署。
从这里我们也可以看出来,Malagu 自身的很多逻辑实现,也是通过自身的扩展点扩展实现,这样做的好处如下:
- 内外扩展机制的统一。
- 简化扩展机制,降低学习门槛。
- 使用自己的扩展,实现自身的能力,吃自己的狗粮,让扩展得到真实的场景验证与打磨,确保扩展点的合理性。
- 顺便提供了扩展点标准使用案例,让框架代码本身就是一种很好的文档。
部署应用
部署应用的设计理念与构建应用是一样的。Malagu 虽然提供了丰富的组件功能,但是当我们逐步学习 Malagu 的时候,会发现很容易举一反三,甚至能够预测 Malagu 应该是如何实现的,这里面其实就是统一、正交的设计哲学在里面起作用。
而对 Malagu 自身也是很有好处:保持框架自身复杂度稳定,不会随着功能的增加而增加。
我们可以通过如下命令进行部署:
# 部署到腾讯云云函数
malagu deploy -m scf
# 部署到阿里云函数计算
malagu deploy -m fc
# 部署到 AWS Lambda
malagu deploy -m server
# 部署到用户自定义的托管平台
malagu deploy -m xxxx
正如上文所说,部署命令默认会先执行构建。我们也可以通过 targets
指定构建目标,也可以指定模式选项
,这里的模式不仅仅是给构建阶段用的
,部署阶段
也会根据模式的不同,激活不同的部署插件进行部署。
不同的部署插件都是通过 Deploy Hook 扩展点
实现。当然我们也可以在 package.json 中直接依赖具体的部署插件。直接依赖的插件默认就是激活的。
Malagu 默认提供了如下托管平台适配插件:
@malagu/scf-plugin
:腾讯云云函数平台适配插件。@malagu/fc-plugin
:阿里云函数计算平台适配插件。@malagu/lambda-plugin
:AWS Lambda 平台适配插件。
使用者也可以基于同样的扩展机制实现其他托管平台的适配插件。
在 Malagu 2.0 版本中,框架提供了运行时机制,方便一键部署到云平台,不再需要手动添加云平台的依赖。比如我们现在要将代码部署到腾讯云函数,只需要指定mode
为scf
即可,框架会自动安装相关所需要的依赖:
malagu deploy -m scf
如果您是首次部署,命令行工具会自动提示您输入云平台相关的访问秘钥信息(AccessKey),您也可以在项目根目录下执行malagu config
手动配置或修改访问秘钥信息。更多有关平台访问秘钥配置。
➜ backend-app malagu config -m scf #用于修改腾讯云云函数密钥信息
___
/'\_/`\ /\_ \
/\ \ __ \//\ \ __ __ __ __
\ \ \__\ \ /'__`\ \ \ \ /'__`\ /'_ `\/\ \/\ \
\ \ \_/\ \/\ \L\.\_ \_\ \_/\ \L\.\_/\ \L\ \ \ \_\ \
\ \_\\ \_\ \__/.\_\/\____\ \__/.\_\ \____ \ \____/
\/_/ \/_/\/__/\/_/\/____/\/__/\/_/\/___L\ \/___/
/\____/
@malagu/cli@2.30.0 \_/__/
╭──────────────────────────────────────────────────╮
│ Serverless First Development Framework │
│ Runtime<malagu> │
╰──────────────────────────────────────────────────╯
? Account Id ***********3699
? Access Key Id ***********nd5G
? Access Key Secret ***********UXJo
? Default region name (Use arrow keys)
❯ ap-guangzhou
ap-shanghai
ap-beijing
ap-chengdu
ap-hongkong
ap-mumbai
ap-singapore
(Move up and down to reveal more choices)
部署成功后的效果:
Deploying backend-app to the ap-guangzhou region of SCF...
- SCF:
✔ Skip default namespace
✔ Create backend-app function
✔ Publish Version 1
✔ Create test alias to version 1
- API Gateway:
✔ Update malagu service
✔ Create backend-app api
- Url: https://service-e6ozizj8-123456.gz.apigw.tencentcs.com/test/backend-app/
✔ Release test environment
Deploy finished