扩展

ℹ️INFO

如何开发扩展并推送到npmjs

如何识别的

大致的目录结构
node_modules/                 // Node.js 依赖包
 ├── pkg-name                 // 相关模块
 │      ├── lib/              // 工程目录
 │      │    └── index.js     // 入口文件
 │      └── package.json      // 工程配置文件

会读取node_modules/pkg-name/package.json

解析并得到main

以入口文件的目录为工程目录

服务端

服务端配置

package.json
{
  "name": "@alemonjs/test", // * 包名
  "version": "0.0.1", // * 版本号
  "author": {
    "name": "ningmengchongshui",
    "email": "ningmengchongshui@gmail.com",
    "url": "https://github.com/ningmengchongshui"
  },
  "type": "module", // * 仅支持esm
  "main": "lib/index.js", // * 包入口
  "scripts": {
    "build": "npx lvy build"
  },
  "exports": {
    ".": "./lib/index.js", // * 包入口
    "./package": "./package.json" // * 包配置信息
  },
  "keywords": ["alemonjs"], // *
  "publishConfig": {
    "registry": "https://registry.npmjs.org", // *
    "access": "public" // *
  },
  "alemonjs": {
    // 应用服务器相关配置
    "web": {
      // html服务根目录。即 dist/index.html
      "root": "dist"
    }
  }
  // 要发布模块,请确保没有以下内容。
  // "private": true,
  // "workspaces": ["packages/*"]
}

桌面端

桌面端配置

package.json
{
  "exports": {
    "./desktop": "./lib/desktop.js" // * 桌面扩展入口脚本,固定导出
  },
  "alemonjs": {
    // 应用服务器相关配置
    "web": {
      // html服务根目录。即 dist/index.html
      "root": "dist"
    },
    // 桌面相关配置
    "desktop": {
      "logo": "public/logo.png",
      // "logo": "antd.OpenAIOutlined",
      "command": [
        {
          "name": "test",
          "icon": "public/logo.png",
          "command": "open.test" // 发送指令
        }
      ],
      "sidebars": [
        {
          "command": "open.test"
        }
      ],
      "menus": [
        {
          "command": "open.test"
        }
      ]
    }
  }
}
type Desktop = {
  // 应用基础LOGO
  // 支持antd图标,如 antd.OpenAIOutlined
  // https://ant.design/components/icon-cn
  logo: string
  // 指令输入框 - 窗体上方的指令输入框
  command: CommandItem[]
  // 侧边栏应用 - webview 里的 侧边栏
  sidebars: CommandItem[]
  // 菜单按钮 - 窗体的左侧导航栏
  menus: CommandItem[]
  // 控件按钮 - 窗体上方,指令输入框的两侧的控件按钮
  controls: ControlItem[]
}

type CommandItem = {
  name: string // 必要的command名
  icon: string // 图标(可选) 支持antd图标
  command: string // 要执行的指令
}

type ControlItem = {
  position: 'left' | 'right' // 位置。macos默认右边,windows/linux默认左边。
  icon: string // 图标 支持antd图标
  command: string // 要执行的指令
}

指令

注意command有2类约定前缀

view.

view.home 前往首页

view.git-exp-manage git扩展管理

view.npm-exp-manage npm扩展管理

view.webview 应用中心

view.settings 设置

view.settings.about 设置-关于

view.settings.theme 设置-主题

view.settings.files 设置-文件

view.settings.notice 设置-更新日志

app.

app.open.devtools 打开开发者工具

周期

desktop.js
// 被激活的时候。
export const activate = context => {}
desktop.ts
// ts
import { Context } from '@alemonjs/process'
export const activate = (context: Context) => {}

通知推送

desktop.js
export const activate = context => {
  context.notification('扩展加载')
}

渲染

desktop.js
import { readFileSync } from 'fs'
import { dirname, join } from 'path'
import { fileURLToPath } from 'url'
// 当前目录
const __dirname = dirname(fileURLToPath(import.meta.url))
export const activate = context => {
  // 创建一个 webview。
  const sidebarWebView = context.createSidebarWebView(context)
  // 监听指定指令的执行
  context.onCommand('open.test', () => {
    const dir = join(__dirname, 'assets', 'index.html')
    // 确保路径存在
    const html = readFileSync(dir, 'utf-8')
    // 立即渲染 webview
    sidebarWebView.loadWebView(html)
  })
}

从webview到app

  • 发送消息
index.js
const API = createDesktopAPI()
API.postMessage({
  type: 'pong',
  data: ''
})
  • 接收消息
desktop.js
export const activate = context => {
  // 创建一个 webview。
  const sidebarWebView = context.createSidebarWebView(context)
  // 监听 webview 的消息。
  sidebarWebView.onMessage(data => {
    // { type: 'pong',data: ''}
  })
}

从app到webview

  • 发送消息
desktop.js
export const activate = context => {
  // 创建一个 webview。
  const sidebarWebView = context.createSidebarWebView(context)
  // 发送消息到webview。
  sidebarWebView.postMessage({
    type: 'ping',
    data: ''
  })
}
  • 接收消息
index.js
const API = createDesktopAPI()

API.onMessage(data => {
  //  {  type: 'ping', data: '' }
})

主题

  • 主题变量
:root {
  --alemonjs-primary-bg: #3498db;
  /* 
    内置一套以--alemonjs开头的主题变量,
    更多变量请在桌面的主题配置中查看。
  */
}

推荐使用 @alemonjs/react-ui ,是一组自带主题的库

资源路径

desktop.js
import { dirname, join } from 'path'
import { fileURLToPath } from 'url'
// 当前目录
const __dirname = dirname(fileURLToPath(import.meta.url))
export const activate = context => {
  // 创建 webview 路径
  const styleUri = context.createExtensionDir(
    join(__dirname, 'assets', 'index.css')
  )
  const scriptUri = context.createExtensionDir(
    join(__dirname, 'assets', 'index.js')
  )
  // 可替换 html 内部资源,确保正确加载
}