
在许多历史项目中,jQuery 承担了选择器、事件、AJAX、动画与插件生态的核心角色。随着组件化、响应式与工程化的发展,迁移到 Vue 3 能显著提升可维护性与性能。本文给出一套渐进式方案与避坑清单,帮助在保业务稳定的前提下完成迁移。
vue@3、pinia、vue-router、axios。<div id="app-root"></div>。createApp 并 mount。services,统一错误处理、重试、取消与鉴权。pinia 管理全局状态,避免跨组件隐式数据共享。vue-router 接管子路由。vee-validate、yup)。import $ from 'jquery';
export const jqSelect2 = {
mounted(el, binding) {
$(el).select2(binding.value || {});
},
beforeUnmount(el) {
$(el).select2('destroy');
}
};在组件中使用:
<template>
<select v-jq-select2="opts"><option value="1">A</option></select>
<select v-jq-select2><option value="2">B</option></select>
<select v-jq-select2><option value="3">C</option></select>
<select v-jq-select2><option value="4">D</option></select>
</template>
<script setup>
import { jqSelect2 as vJqSelect2 } from './directives/jqSelect2';
const opts = { minimumResultsForSearch: 5 };
</script>import { createApp } from 'vue';
import Widget from './Widget.vue';
const el = document.getElementById('app-root');
const app = createApp(Widget, { initData: window.__BOOT__ });
app.mount(el);
function dispose() {
app.unmount();
}// Vue 侧
function emitEvent(name, detail) {
window.dispatchEvent(new CustomEvent(name, { detail }));
}
// jQuery 侧
$(window).on('app:event', (e, payload) => {
// 处理 payload
});将 $.ajax 迁移为 fetch/axios,统一超时、取消、重试与错误码。
import axios from 'axios';
const api = axios.create({ baseURL: '/api', timeout: 8000 });
api.interceptors.response.use(
r => r,
async e => {
const status = e.response?.status;
if (status >= 500) {
await new Promise(r => setTimeout(r, 300));
return api.request(e.config);
}
return Promise.reject(e);
}
);
export async function getList(params) {
const c = new AbortController();
const p = api.get('/list', { params, signal: c.signal });
return { promise: p, cancel: () => c.abort() };
}在 Vue 3 中使用 Composition API 管理状态与副作用。
import { ref, watchEffect, onMounted, onBeforeUnmount } from 'vue';
export function useListService() {
const list = ref([]);
const loading = ref(false);
let cancel = () => {};
async function load(params) {
loading.value = true;
const { promise, cancel: c } = getList(params);
cancel = c;
try {
const res = await promise;
list.value = res.data.items;
} finally {
loading.value = false;
}
}
onBeforeUnmount(() => cancel());
return { list, loading, load };
}ref/reactive。vue-router 共存时,统一入口与回退策略。从 jQuery 迁移到 Vue 3 的核心在于渐进式共存与有序交接。通过组件化替换、数据层统一、路由与构建升级,并用指令或包装组件托管 jQuery 插件生命周期,可以在最小风险下逐步完成迁移。配合灰度发布、指标监控与回滚预案,确保迁移过程可控与可恢复。