O with occluded right edge to appear also as a C Web Widget 指南 文档 Toggle darkmode

应用开发: 开发

浏览器在过去几年中得到了很大改进,现在可以使用浏览器的原生模块进行 Web Widget 应用开发,而无需复杂的构建工具。

项目生成器

Web Widget CLI 是一个项目生成器,它为如下技术栈提供了可开箱即用的模板代码:

  • Lit
  • Vue2 / Vue3
  • React
  • Vanilla

请执行如下命令启动它:

npm init @web-widget

运行服务器

生成器使用 Vite 作为开发工具。要在项目中运行服务器,请执行以下命令:

npm run dev

当你编辑代码后,浏览器将自动重新加载。

框架适配

将不同的前端框架的组件包装成 Web Widget 应用格式

React

import { App } from './App.tsx';
import ReactDOM from 'react-dom';

export default () => {
  let vdom;
  return {
    async mount({ container, data }) {			
      if (ReactDOM.createRoot) {
        vdom = ReactDOM.createRoot(container);
        vdom.render(<App />);
      } else {
        // React < 18
        ReactDOM.render(<App />, container);
      }
    },

    async unmount() {
      if (vdom && vdom.unmount) {
        vdom.unmount();
      } else {
        // React < 18
        ReactDOM.unmountComponentAtNode(container);
      }
      vdom = null;
    },
  };
};

Vue3

import { createApp } from 'vue';
import App from './App.vue';

export default () => {
  let appWrap;
  let app;

  return {
    async mount({ container }) {
      appWrap = document.createElement('div');
      container.appendChild(appWrap);

      app = createApp(App);
      app.mount(appWrap);
    },
    async unmount({ container }) {
      app.unmount();
      container.innerHTML = '';
      appWrap = app = null;
    }
  };
};

Vue2

import Vue from 'vue';
import App from './App.vue';

export default () => {
  let appWrap;
  let app;

  return {
    async mount({ container }) {
      appWrap = document.createElement('div');
      container.appendChild(appWrap);

      app = new Vue({
        el: appWrap,
        render(h) {
          return h(App);
        }
      });
    },
    async unmount({ container }) {
      app.$destroy();
      container.innerHTML = '';
      appWrap = app = null;
    }
  };
};

后续将会提供框架适配器简化上述样板代码的工作。

裸模块导入

javascript 项目中的常见做法是使用所谓的“裸模块导入”。这些是 imports 语句,它仅指定包的名称或包内的文件。

例如:

import foo from 'foo';

node_modules 文件夹中的依赖项需要引用其他包时,此类导入很有用。不幸的是,今天的浏览器不理解这种导入方式,需要某种形式的预处理来解析导入以引用实际文件位置。幸运的是 Vite 已经自动帮我们处理了这个问题。

将来,像 import maps 这样的标准将允许浏览器理解这些类型的导入,而无需转换步骤。对于目前,我们有一个可以过渡到标准的方案,你可以通过发布文档了解到如何处理浏览器兼容问题。