自动化按需导入组件库的工具rust版本完成开源了

背景

当我为每个Vue项目使用ui组件库的时候,都会使用按需导入的方式来使用ui组件库。但是每次按需导入,不可避免的就需要做以下三步。我们以element plus ui组件库为例。

1. 安装依赖

第一步,当然是需要安装依赖。命令如下:

shell 复制代码
pnpm add unplugin-vue-components unplugin-auto-import // npm和yarn同理

2. 添加vite配置

第二步,就是往vite的配置里面添加配置,如下所示:

ts 复制代码
// vite.config.ts
import { defineConfig } from 'vite'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

export default defineConfig({
  // ...
  plugins: [
    // ...
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [ElementPlusResolver()],
    }),
  ],
})

3. 修改ts配置

第三步,就是写入ts的配置,如下所示:

tsconfig.json 复制代码
{
     "include": ["components.d.ts", "auto-imports.d.ts"]
}

虽然说这三步实际也花费不了多少时间,但是每个项目都这么做,那不是太费时间了吗?这个工具的出现就是为了解决这个问题。

有了这个工具,我们只需要一个命令就可以完成以上三个步骤。如下所示:

shell 复制代码
// 当然前提需要安装这个工具
ew-auto-import-tool --library element-plus

rust版本的出现

在这之前,我也将这个工具发布了一个npm包,并且也写了一篇介绍使用文章

这个版本的工具源码是使用typescript编写的,为了提升性能和加快编译效率,我特意又花时间完成了rust版本

让我们一起来看看rust版本是如何使用这个工具更高效的完成按需导入的自动化吧。

编写一个sh脚本,代码如下所示:

sh 复制代码
#!/bin/bash

# 颜色定义
GREEN="\033[0;32m"
BLUE="\033[0;34m"
YELLOW="\033[0;33m"
RED="\033[0;31m"
NC="\033[0m" # No Color

# 打印带颜色的消息
function print_message() {
  echo -e "${BLUE}===> ${1}${NC}"
}

# 检查命令是否存在
function check_command() {
  if ! command -v $1 &> /dev/null; then
    echo -e "${RED}错误: $1 未安装,请先安装它。${NC}"
    exit 1
  fi
}

# 检查必要的命令
check_command "cargo"
check_command "npm"

# 设置工作目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
RUST_DIR="$(dirname "$SCRIPT_DIR")"
EXAMPLE_PROJECT="my-vue-app"
EXAMPLE_DIR="$SCRIPT_DIR/$EXAMPLE_PROJECT"

print_message "开始运行 Auto Import Tool 示例"

# 编译 Rust 工具
print_message "编译 Rust 工具"
cd "$RUST_DIR"
cargo build --release
if [ $? -ne 0 ]; then
  echo -e "${RED}编译失败,请检查错误信息。${NC}"
  exit 1
fi
echo -e "${GREEN}编译成功!${NC}"

# 创建示例 Vue 项目
print_message "创建示例 Vue 项目"
cd "$SCRIPT_DIR"

# 如果项目已存在,询问是否删除
if [ -d "$EXAMPLE_PROJECT" ]; then
  echo -e "${YELLOW}警告: $EXAMPLE_PROJECT 目录已存在。${NC}"
  read -p "是否删除并重新创建? (y/n) " -n 1 -r
  echo
  if [[ $REPLY =~ ^[Yy]$ ]]; then
    rm -rf "$EXAMPLE_PROJECT"
  else
    echo -e "${YELLOW}使用现有项目继续。${NC}"
  fi
fi

# 如果项目不存在,创建新项目
if [ ! -d "$EXAMPLE_PROJECT" ]; then
  echo -e "${GREEN}创建新的 Vue + TypeScript 项目...${NC}"
  npm create vite@latest $EXAMPLE_PROJECT -- --template vue-ts
  cd "$EXAMPLE_PROJECT"
  npm install
else
  cd "$EXAMPLE_PROJECT"
fi

# 运行 Auto Import Tool
print_message "运行 Auto Import Tool 配置 Element Plus"
TOOL_PATH="$RUST_DIR/target/release/ew-auto-import-tool"

echo -e "${YELLOW}选择运行模式:${NC}"
echo "1) 自动模式 (使用 Element Plus)"
echo "2) 交互模式 (手动选择组件库)"
read -p "请选择 (1/2): " -n 1 -r
echo

if [[ $REPLY =~ ^[1]$ ]]; then
  "$TOOL_PATH" --library element-plus --path "$EXAMPLE_DIR"
else
  "$TOOL_PATH" --path "$EXAMPLE_DIR"
fi

# 创建示例组件
if [ $? -eq 0 ]; then
  print_message "创建示例组件以验证配置"
  
  # 创建一个使用组件库的示例组件
  cat > "$EXAMPLE_DIR/src/App.vue" << EOL
<template>
  <div class="container">
    <h1>Element Plus 自动导入示例</h1>
    <div class="card">
      <el-form>
        <el-form-item label="用户名">
          <el-input v-model="username" placeholder="请输入用户名"></el-input>
        </el-form-item>
        <el-form-item label="密码">
          <el-input v-model="password" type="password" placeholder="请输入密码"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="handleSubmit">登录</el-button>
          <el-button>取消</el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

// 注意:ElMessage 需要手动导入,但其他组件不需要
const username = ref('')
const password = ref('')

const handleSubmit = () => {
  if (!username.value || !password.value) {
    ElMessage.warning('请输入用户名和密码')
    return
  }
  ElMessage.success('登录成功!')
}
</script>

<style>
.container {
  max-width: 800px;
  margin: 0 auto;
  padding: 20px;
}

.card {
  padding: 20px;
  border-radius: 8px;
  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
</style>
EOL

  print_message "示例创建完成"
  echo -e "${GREEN}现在你可以运行项目来测试自动导入功能:${NC}"
  echo -e "cd $EXAMPLE_PROJECT && npm run dev"
fi

print_message "示例运行完成"

整个脚本代码的核心就是使用cargo build --release命令编译出工具的可执行文件,然后初始化一个vue项目并执行该可执行文件,这样就完成了一个示例。

使用步骤

前提条件

  • 已安装 Rust 和 Cargo
  • 已编译 Auto Import Tool 的 Rust 版本

使用方法

1. 编译工具

rust 目录下运行以下命令编译工具:

bash 复制代码
cargo build --release

编译后的可执行文件将位于 target/release 目录下。

2. 创建一个 Vue 项目

使用 Vite 创建一个新的 Vue 项目:

bash 复制代码
npm create vite@latest my-vue-app -- --template vue-ts
cd my-vue-app
npm install

3. 使用工具配置组件库

运行编译后的工具,并指定要配置的组件库和项目路径:

bash 复制代码
# 使用相对路径运行工具
../target/release/ew-auto-import-tool --library element-plus --path ./my-vue-app

或者使用交互式方式:

bash 复制代码
../target/release/ew-auto-import-tool --path ./my-vue-app

然后按照提示选择要配置的组件库。

如果觉得本工具有用,感谢大家使用,点赞收藏不迷路,点个小star吧,工具源码地址在这里

感兴趣的可以看看源码,后期我再写文章详细讲解源码的实现,今天就到此为止,谢谢大家阅读。

ps: 文章由trae编写完成,本人扩充修改了一下。

相关推荐
不想上班只想要钱30 分钟前
vue3使用<el-date-picker分别设置开始时间和结束时间时,设置开始时间晚于当前时间,开始时间早于结束时间,结束时间晚于开始时间
前端·javascript
Li_Ning211 小时前
为什么 Vite 速度比 Webpack 快?
前端·webpack·node.js
2501_915373881 小时前
Electron 入门指南
前端·javascript·electron
同志327132 小时前
用HTML+CSS做了一个网易云音乐客户端首页
前端·css
小猪欧巴哟2 小时前
pnpm install 安装项目依赖遇到 illegal operation on a directory, symlink 问题
前端·vue.js
独角仙梦境2 小时前
🚀🚀🚀学习这个思路,你也能手撸自己的专属vip脚手架🚀🚀🚀
前端
CJWbiu2 小时前
Github Action + docker 实现自动化部署
前端·自动化运维
关山2 小时前
在TS中如何在子进程中动态实例化一个类
前端
吃瓜群众i2 小时前
兼容IE8浏览器的8个实用知识点
前端·javascript
前端烨2 小时前
vue3子传父——v-model辅助值传递
前端·vue3·组件传值