iTwitter 2 前端开发

iTwitter 2 前端开发

·

1 min read

iTwitter 2 主题是基于 Vue3 + TypeScript 开发的 Typecho 主题,主题功能正在逐步完善中。

为什么要使用这种方式开发主题

使用 Vue 开发主题必然是未来趋势,在以往使用 JQuery 开发中往往需要通过获取元素再对元素进行事件绑定、数值获取,在没有 TypeScript 的帮助下更是很容易将代码堆积成屎山导致后续开发难度增加导致无从下手。

在以往我做过很多的尝试,比如使用 gulp 流将 js 代码打包、将 less 代码编译成 css 代码后压缩打包。但是这种开发方式始终不如 Webpack 打包方式来的高效。

而使用 Vue 基于模块化思想、组件化思想开发,可以使代码结构清晰,便于维护。组件复用、数据传递、生命周期钩子等特性使开发更加高效。并且 NodeJS 为开发者提供了大量的第三方库只需要通过 npm install *** 即可安装使用,不需要自己重复造轮子,提高了开发效率。

编辑器组件代码

<template>
  <!-- 分隔符 -->
  <a-divider :margin="12" />
  <a-space class="yoniu-editor" :size="12" fill>
    <!-- 遍历功能组件:基于 IOC -->
    <template v-for="(plugin, _) in plugins" :key="_">
      <component :is="plugin" />
    </template>
  </a-space>
</template>

<script lang="ts" setup>
import Emoji from "@/components/emoji/Emoji.vue";
import Media from "@/components/media/Media.vue";
import InsertIcon from "@/components/icon/InsertIcon.vue";
import Colorful from "@/components/colorful/Index.vue";

const plugins = {
  Emoji,
  Media,
  InsertIcon,
  Colorful,
};
</script>

Webpack 打包功能实现

在主题中有三个比较重要的功能:

  • 编辑器拓展功能

  • 主题设置功能

  • 主题主要功能

在本项目的 Webpack 打包入口分了三个包 editorsettingtheme 分别对应以上功能。

以上三个功能包全部打包为 js 文件,输出目录为 主题文件/assets/js

optimization 配置中将 Webpack runtime 提取为单独的 runtime.bundle.js 另外分离出三个包共用的代码为 public.bundle.js。所以在主题引用功能包前,需要引用 runtime.bundle.jspublic.bundle.js

因为使用了 Arco Design,所以为了更方便开发主题,使用了组件自动导入。具体查看 webpack.config.js 中的 plugin 配置。

另外,由于 Webpack 打包样式文件时会将样式代码以 js 代码输出为页面的 <style> 标签,本项目使用了 MiniCssExtractPlugin 来将样式代码单独打包为 css 文件,输出目录为 主题文件/assets/css

Webpack 打包速度优化

回看以往 Webpack 大都使用 babel 做代码转化,对于 TypeScript 的支持还需要很多 babel 插件的使用,最终造成 Webpack 打包缓慢。

所以本项目使用了更先进的 SWC 作为 JSTS 文件的打包工具,使打包速度快了至少 3 倍以上。并在 watch 模式下可以保证保存一秒内即可编译完成。