Cli

基础工作流

这篇文章会简述 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 支持 frontendbackend

通过命令选项指定构建目标:

malagu build -t backend  # 或者 malagu build --targets backend

通过配置文件指定构建目标:

# malagu.yml
targets: [backend]

当都没有指定的情况下,targets 默认值为 [frontend, backend]

在实际构建场景中,只有构建目标往往是很难满足多种多样的运行时平台。比如不同云厂商的 Serverless 平台,对构建产物的要求是不一样的。Malagu 通过模式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 版本中,框架提供了运行时机制,方便一键部署到云平台,不再需要手动添加云平台的依赖。比如我们现在要将代码部署到腾讯云函数,只需要指定modescf即可,框架会自动安装相关所需要的依赖:

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
点击这里了解更加详细的部署参数。

Copyright © 2024 Zero (github@groupguanfang) 粤ICP备2023102563号