首页 > 其他分享 >fastify-autoload + ncc + s3 实现模块的插件化开发加载

fastify-autoload + ncc + s3 实现模块的插件化开发加载

时间:2023-10-17 13:33:05浏览次数:36  
标签:插件 s3 app plugins autoload js fastify ncc

以前简单说明过基于fastify-autoload 的插件化加载fastify插件,方便实现开发,但是对于实际生产环境我们可以需要频繁的模块修改,发布以及构建,所以需要我们需要频繁的调整,不是很方便,我们可以基于ncc 进行入口的打包,同时对于每个插件也基于ncc 打包为独立的文件,这样我们开发的插件只需要基于ci/cd 构建之后放到s3中,然后reload 服务就可以了

参考集成

 


简单说明: 基于fastify-autoload 加载插件,但是存储的存储基于ci/cd 直接可以存储到s3 中,对于运行示例基于juicefs 或者mountpoint-s3 进行
s3 数据的挂载,这样数据就是动态的

项目结构

  • 参考结构
 
├── Dockerfile
├── README.md
├── app-restart.js
├── app.js
├── config.js
├── docker-compose.yaml
├── package.json
├── plugins
│   ├── apps
│   │   └── app.js
│   ├── home
│   │   └── app.js
│   ├── init
│   │   └── app.js
│   ├── login
│   │   └── app.js
│   └── users
│       └── app.js
├── tsup.config.js
└── yarn.lock

代码简单说明

  • pacakge.json
{
  "name": "fastify-autoload-app",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "@fastify/autoload": "^5.7.1",
    "@fastify/restartable": "^2.1.1",
    "dotenv": "^16.3.1",
    "fastify": "^4.24.0",
    "fastify-plugin": "^4.5.1",
    "hashids": "^2.3.0"
  },
  "scripts": {
    "plugin-build": "ncc build app.js -o dist ",
    "plugin-app": "ncc build plugins/apps/app.js  -o distapp/plugins/apps",
    "plugin-init": "ncc build plugins/init/app.js  -o distapp/plugins/init",
    "plugin-home": "ncc build plugins/home/app.js  -o distapp/plugins/home",
    "plugin-users": "ncc build plugins/users/app.js  -o distapp/plugins/users",
    "plugin-login": "ncc build plugins/login/app.js  -o distapp/plugins/login",
    "tsup": "tsup app.js -d distv2",
    "myplugin-build": "concurrently  'yarn:plugin-*'"
  },
  "devDependencies": {
    "@vercel/ncc": "^0.38.0",
    "concurrently": "^8.2.1",
    "tsup": "^7.2.0"
  }
}
  • app.js
    应用的入口
 
require('dotenv').config()
const Fastify = require('fastify')
const path = require("path")
const autoLoad = require('@fastify/autoload');
const config = require('./config')
 
const app = Fastify({
    logger: true,
    ignoreDuplicateSlashes: true,
}
);
// 加载插件
app.register(autoLoad, {
    dir: path.join(__dirname, config.pluginPath)
})
app.listen({
    port: 3000,
    host: '0.0.0.0',
    backlog: 511
}, (err, address) => {
    if (err) {
        console.log(err)
        process.exit(1)
    } else {
        console.log(`Server listening on ${address}`)
    }
})
  • 插件开发
    就是一个标注的基于fastify-plugin的包装,主要说明一个简单的login,其他的类似
 
const fp = require('fastify-plugin')
function login(fastify, opts, done) {
    fastify.get("/login", async (req, res) => {
        res.send({
            version:"v3333",
            login:"login"
        })
    })
    done()
}
module.exports = fp(login, {
    name: "login"
})
  • docker 运行
    Dockerfile 主要包含了入口
 
FROM  node:18.18.2-buster-slim
WORKDIR /app
ENTRYPOINT [ "node","index.js" ]

docker-compose 文件

version: "3"
services:
  app:
    build: ./
    volumes:
      - ./dist:/app/
      - ./distapp:/app/plugins
    env_file:
      - ./.env
    ports:
      - "3000:3000"

构建之后的效果

对于多个插件的构建基于了concurrently,当然基于tsup 也是一种可选的方式,基本上类似

说明

此处基于s3 的插件加载实际上可以使用类似文件系统扩展的包,目前已经有一些底层使用s3 但是可以暴露为标注node fs 操作的包
但是比较稳定的似乎不是很好,对于我们新开发的插件直接基于标准开发,然后使用ncc 包装为一个单一文件,之后reload 服务就
可以生效了,还是很方便的,至少对于很多环境我们需要使用npm 包,但是网络不是很方便的是否很简单了不少,目前此方式是有
一些缺陷,相同的npm 包会有多个,同时可能会造成文件比较大,当然基于ncc 的集成模式实际上也是实现了一种简单的多版本包
如果能实现类似webpack module federation 的能力,就更加方便了

参考资料

https://github.com/vercel/ncc
https://github.com/fastify/fastify-autoload
https://github.com/fastify/fastify-plugin
https://github.com/awslabs/mountpoint-s3
https://github.com/juicedata/juicefs
https://github.com/rongfengliang/fastify-autoload_ncc_pacakge

标签:插件,s3,app,plugins,autoload,js,fastify,ncc
From: https://www.cnblogs.com/rongfengliang/p/17769470.html

相关文章

  • VSCode 新手入门第一期 基本安装&常用插件
    前言来一大份适用于科大的VSCode上手全家桶安装VSCode官方下载地址:https://code.visualstudio.com/Download这边直接大按钮下的是User版(只能在你的账户里用),我自己下的是下面的SystemInstaller,优点是全局可用,缺点是补分操作需要管理员权限以上两个版本下哪个都可以由于现......
  • fastify-autoload 一个方便的插件动态加载包
    fastify-autoload是一个方便的fastify插件加载工具,我们可以基于路径直接加载开发的插件参考使用配置constFastify=require('fastify')constpath=require("path")constautoLoad=require('@fastify/autoload');constapp=Fastify({logge......
  • C#开发wps插件
    首先安装wps2016专业版,然后再开发。第一步,打开vs2010,新建一个类库项目  说明:其中Resource1.resx是资源文件,它包括了两张png图片一个定义ribbon的txt文件。第二步,项目生成设置勾选com互操作注册。第三步:设置程序集文件打开AssemblyInfo.cs设置ComVisible为true,如图所示......
  • UE功能性插件
    ---打开资源管理器UCLASS()classOPENWINDOWSFILE_APIUMyBlueprintFunctionLibrary:publicUBlueprintFunctionLibrary{ GENERATED_BODY()public: UFUNCTION(BlueprintCallable,Category="OpenWindowsFile") staticTArray<FString>OpenWindowsFiles();};#......
  • 2020年全球30米湿地数据产品(GWL_FCS30)
    2020年全球30米湿地数据产品(GWL_FCS30)简介与Notebook示例该数据集利用时间序列的Landsat反射率数据产品和Sentinel-1SAR影像,加上分层分类策略和局部自适应随机森林分类算法,成功地整合出2020年第一个具有精细分类系统的全球30米湿地产品。湿地被分为四种内陆湿地(沼泽、沼泽、水淹......
  • elasticsearch安装dynamic-synonym插件
    今天就来和大家讲讲如何在es中安装dynamic-synonym插件,首先我们需要去github上下载与es版本对应的插件,一般github上基本都是本地词库和远程文本词库的,在gitee上可以找到采用数据库作为词库的源码,大致思路就是修改一些参数配置,然后自己创建一个表作为同义词词库,最后将打包好的jar包......
  • mybatisplus3.5.3版本,数据权限如何使用
    1、添加依赖<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.......
  • 【CSS3】CSS3 3D 转换 ③ ( 3D 透视视图 | translateZ 转换分析 | 网页调试工具调试 t
    文章目录一、translateZ转换分析1、translateZ转换对应的空间分析2、网页调试工具调试translateZ属性值二、代码示例-translateZ转换分析1、代码示例-translateZ为0的参照示例2、代码示例-translateZ为200示例一、translateZ转换分析1、translateZ转换对应的......
  • Vue3| Pinia 持久化插件
    对vuex或Pinia里面的内容做本地持久化1.安装插件:npmipinia-plugin-persistedstate2.将插件添加到pinia实例上①main.js里导入持久化插件:importpiniaPluginPersistedstatefrom'pinia-plugin-persistedstate'② app.use(pinia.use(piniaPluginPersistedstate))......
  • IntelliJ IDEA 2023.2社区版插件汇总
    参考插件帝:https://gitee.com/zhengqingya/idea-config/IDEA插件市场:https://plugins.jetbrains.com/突发小技巧:使用插件时要注意插件的版本兼容性,并根据自己的实际需求选择合适的插件。同时,不要过度依赖插件,保持简洁和高效的开发环境才是最重要的。@目录1.SmartTomc......