自定义套件

Feflow v0.16.0 版本重新设计了它的生态体系,去掉了构建器、部署器等概念,整合为一个套件。它将项目的构建、部署、代码检查等功能都整合在一起,并且套件会跟随项目一起走,存储在项目的 node_modules 里。

这里我们重点对如何开发一个 Feflow 套件进行讲解,以 feflow-devkit-ivweb 为例。

# 配置 devkit.json 文件

首先,我们需要创建一个空文件夹,命名为 feflow-devkit-ivweb,并且在文件夹下新建一个 devkit.json 或者 devkit.js 文件,以 devkit.json 为例,配置如下:

{
  // 必须,builder 包含各种构建命令的集合
  "builders": {
    // 开发者自己定义,dev 意味着套件包含 dev 命令,一般本地开发命令约定俗成就是 dev
    "dev": {
      // dev 命令对应的真正实现脚本
      "implementation": "./lib/commands/dev.js",
      // dev 的描述,会在 fef -h 的时候显示出来
      "description": "Mini program development mode.",
      // dev 的子命令
      "optionsDescription": {
        // 简单的命令描述
        "p": "选择端口构建",
        // 支持别名
        "dist": {
          "description": "构建产物目录",
          "alias": "d"
        }
      }
    },
    // 套件 build 命令的配置,一般构建部署时的构建就是用 build 命令
    "build": {
      "implementation": "./lib/commands/build.js",
      "description": "Build a mini program bundle."
    }
    // ...... 其他命令
  }
}

# 创建命令对应的实现文件

配置好了 devkit.json 文件,接下来就是一一实现里面定义的各个命令对应的脚本。以 dev 命令为例,通过上述脚本地址可以知道我们需要在 feflow-devkit-miniprogram 下创建一个 lib 文件夹,然后在 lib 文件夹下创建 command 文件夹,最后在 command 文件加下创建 dev.js 文件。当然,文件路径可以自定义,这样的创建文件就按照自己定义的路径去创建。

dev.js 文件需要向外部暴露一个函数,当执行 fef dev 的时候其实就是执行暴露出来的函数,如下所示:


// main.ts
import webpack from 'webpack';
import Builder from './builder';
import Config from './config';
import Server from './server';
import { postMessage, BuilderType } from './util';
export interface BaseConfig {
    [propName: string]: any;
}

function builderWebpack(cmd: string) {
    const builderOptions = Config.getBuildConfig(cmd);
    const devConfig: BaseConfig = Builder.createDevConfig(builderOptions);
    const prodConfig: BaseConfig = Builder.createProdConfig(builderOptions);
    if (cmd === 'dev') {
        Server(devConfig);
    } else if (cmd === 'build') {
        webpack(prodConfig, (err: any, stats: any) => {
            if (err) {
                console.log(err);
                postMessage.error(BuilderType.build, err);
                process.exit(2);
            }

            postMessage.success(BuilderType.build);

            console.log(
                stats &&
                    stats.toString({
                        chunks: false,
                        colors: true,
                        children: false,
                    })
            );
        });
    }
}
export default builderWebpack;
module.exports = exports.default;

// dev.ts
import Main from '../index';

function run(){
    Main('dev');
}

module.exports = run;
export default run;

具体构建的脚本代码是什么样子,根据不同的构建需求决定,我们这里就不继续展示了。

# 调试和发布

开发好了套件,就要开始调试了,这里和以前构建器的调试有点区别,你需要将套件 npm link 在项目的 node_modules 里面,而不是 ~/.fef 的 node_modules 里面,项目里通过 .feflowrc.json / .feflowrc.js 文件来声明项目的命令所对应的套件命令,格式如下(以 .js 格式的文件为例):

module.exports = {
    // 必须
    devkit: {
        // 必须,代表着 feflow 的命令
        commands: {
            // 推荐,代表着 fef dev 的命令
            dev: {
                // 必须,代表着 fef dev 命令对应执行的套件命令,这里表示使用套件 @tencent/feflow-devkit-miniprogram 的 dev 命令,配置格式为 `<套件>:<命令>`
                builder: "@tencent/feflow-devkit-ivweb-example:dev",
                // 可选,如果上述套件命令支持一些配置,可以写在这里
                options: {}
            },
            // 推荐,代表着 fef build 的命令
            build: {
                // 必须,代表着 fef build 命令对应执行的套件命令,这里表示使用套件 @tencent/feflow-devkit-miniprogram 的 build 命令
                "builder": "@tencent/feflow-devkit-ivweb-example:build",
                // 可选,如果上述套件命令支持一些配置,可以写在这里
                "options": {}
            }
        }
    }
}

调试 OK 后就可以发布了。

代码地址: feflow-devkit-ivweb