Fun Init 自定义模板

偏向技术
/ 0 评论 / 137 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年07月27日,已超过1184天没有更新,若内容或图片失效,请留言反馈。

模板项目目录结构

powershell
custom-fastify          # ① 模板项目根目录
|-- metadata.js         # ② 模板项目配置文件
`-- {{ projectName }}    # ③ 模板根目录
    |-- Funfile
    |-- README.md
    |-- bin
    |-- bootstrap
    |-- package.json
    |-- src
    |-- template.yml
    `-- test
1234567891011

目录结构说明:

  • ① 模板项目根目录:如果模板项目需要上传到 github,则模板项目名称就是仓库名称
  • ② 模板项目配置文件:模板项目配置文件不是必须的,支持两种类型的文件:metadata.json 和 metadata.js
  • ③ 模板根目录:fun init 会从模板根目录开始渲染输出,该目录必须是一个模板表达式。projectName 模板变量来自 fun init --name foo--name 参数。绝大多数场景,模板根目录叫 {{ projectName }} 即可

模板项目配置文件

js
module.exports = {
    // ① 模板项目名称
    "name": "custom-fastify",
    // ② 模板项目描述
    "description": "Fastify template for Custom Runtime",
    // ③ 隐式变量
    "vars": {
        "service": "{{ projectName }}",
        "removeLines": str => str.replace(/^\s*$(?:\r\n?|\n)/gm, '')
    },
    // ④ 提示输入变量(显式变量)
    "userPrompt": [
        {
            "type": "confirm", // ⑤ 提示输入类型
            "name": "httpTrigger", // ⑥ 模板变量名
            "message": "Http Trigger?", // ⑦ 提示信息
            "default": true // ⑧ 模板变量默认值
        },
        {
            "type": "confirm",
            "name": "customDomain",
            "message": "Custom domain?",
            "default": true
        }
    ],
    "copyOnlyPaths": [ "test" ], // ⑨ 设置某些目录和文件不需要渲染,只是简单的拷贝
    "ignorePaths": [ "*.log" ] // ⑩ 拷贝时忽略某些目录和文件
}
12345678910111213141516171819202122232425262728

配置文件说明:

  • ① 模板项目名称:对模板项目简单介绍
  • ② 模板项目描述:对模板项目详细介绍
  • ③ 隐式变量:相对显式变量而言,隐式变量不提示用户输入,可以通过 fun init --var baz=xxx 覆盖配置文件的隐式变量,如果显式和隐式有相同的变量,则该变量不会再提示用户输入,但是这种方式是不推荐使用的,也不要依赖此特性,即显式变量和隐式变量不要有交叉
  • ④ 提示输入变量(显式变量):在用户初始化模板项目的时候,会显式提示用户输入模板变量,底层用的是 Inquirer,⑤、⑥、⑦和⑧ 详情可以参考: Inquirer 文档。当通过 fun init --var foo=xxx 设置了 foo 变量后,则不会再提示用户输入 foo 变量的值,其他没有设置过的显式变量仍然提示输入
  • ⑨ 设置某些目录和文件不需要渲染,只是简单的拷贝:比如一些二进制文件。格式和 gitignore 是一样的,具体可以参考:gitignore 规范
  • ⑩ 拷贝时忽略某些目录和文件:格式和 gitignore 是一样的,具体可以参考:gitignore 规范
  • 配置文件也可以使用变量,其中,projectName 模板变量来自 fun init --name foo--name 参数,还可以使用 fun init --var abc=xxx 中的 abc 变量,但是,如果你不通过 --varabc 变量,在渲染配置文件的时候,可能报变量未定义的错误,可以在使用的时候先判断一下,如:{{ typeof x === 'undefined' ? '' : x}}

支持模板语法的位置

  • 模板项目配置文件
  • 模板根目录
  • 模板根目录下的子目录名称(支持多层嵌套)
  • 模板根目录下的文件名称(支持多层嵌套)
  • 模板根目录下的文件内容(支持多层嵌套)

模板变量设置方式

有三种种方式设置模板变量:

  • 参数设置。通过 -V,--var 参数设置模板变量
  • 显式变量。配置文件中的 userPrompt
  • 隐式变量。配置文件中的 vars

优先级:参数设置 > 隐式变量。
优先级:显式变量 > 隐式变量。

说明:参数设置和显示变量互斥出现,优先级比较没有意义。

模板语法

模板渲染底层是基于 lodash ,详情请参考:lodash 文档

主要用法:

  1. 模板表达式
    模板表达式的正则表达式规则:/{{([\s\S]+?)}}/g ,以 {{ 开头,}} 结尾,中间可以是任意字符。

    # 假设 foo = 'bar'
    hello {{ foo }}!             输出:hello bar!
    {{ foo === 'bar' }}          输出:true
    {{ foo ? foo :'unknown' }}   输出:bar
    1234
  2. 模板代码
    模板代码的正则表达式规则:/<%([\s\S]+?)%>/g ,以 <% 开头,%> 结尾,中间可以是任意字符。

    <% if (foo === 'bar') { %> xxxxxxxxx <% } %>
    1

小结

自定义模板,支持通过配置文件定义渲染规则,模板引擎根据渲染规则渲染模板项目。其中,模板引擎支持模板表达式和模板代码,我们可以通过命令行参数和提示输入方式传递模板变量。

相关文章

0

评论 (0)

取消