对于 Vue 3 + Vite 项目,配置 jQuery 全局变量的方法与 Webpack 项目完全不同。Vite 不直接使用 Webpack 的ProvidePlugin,需要通过 Vite 插件或直接修改全局变量的方式来实现。
以下是为你量身定制的两种方法,强烈推荐使用第一种“自动注入”方案。
✅ 方案一:使用vite-plugin-externals自动注入(推荐)
这个方案最接近原始 Webpack 的ProvidePlugin效果,配置后你无需修改任何组件代码。
操作步骤:
安装依赖:
在项目根目录下,运行以下命令安装jquery和vite-plugin-externals:bash
npm install jquery --save npm install vite-plugin-externals --save-dev
配置
vite.config.ts:
打开你的vite.config.ts文件,添加以下配置:typescript
// vite.config.ts import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { viteExternalsPlugin } from 'vite-plugin-externals' // 引入插件 export default defineConfig({ plugins: [ vue(), // 配置此插件以全局注入 jQuery viteExternalsPlugin({ jquery: 'jQuery', // 关键:将 import 的 jquery 替换为全局的 jQuery 变量 }) ], // 可选:如果你遇到构建问题,可以添加 resolve 别名配置 resolve: { alias: { jquery: 'jquery/dist/jquery.min.js', // 确保指向正确的路径 }, } })在
index.html中引入 jQuery:
在public/index.html的<head>或<body>结束前,添加 jQuery CDN 链接(这是全局变量的来源):html
<!-- 在 public/index.html 中添加 --> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
更新类型声明:
在你的全局类型声明文件(如src/env.d.ts或src/vue-plugin-hiprint.d.ts)中,添加:typescript
// 声明全局 jQuery 和 $ 变量 interface Window { $: any; jQuery: any; } declare const $: any; declare const jQuery: any;重启开发服务器:
bash
npm run dev
📝 方案二:手动设置全局变量(备用方案)
如果方案一遇到问题,可以使用更直接的手动方案。
安装 jQuery:
bash
npm install jquery --save
修改
main.ts或main.js:
在项目的入口文件(通常是src/main.ts)最顶部,添加以下代码:typescript
// src/main.ts import * as jquery from 'jquery' // 将 jQuery 设置为全局变量 ;(window as any).$ = jquery.default || jquery ;(window as any).jQuery = jquery.default || jquery // 原有的 Vue 应用创建代码 import { createApp } from 'vue' import App from './App.vue' // ...更新类型声明(同方案一的第4步)。
重启开发服务器。
🔧 验证配置是否成功
配置完成后,请按以下步骤验证:
在浏览器中打开你的设计器页面。
打开开发者工具 (F12) → 控制台 (Console)。
输入
console.log($, jQuery)并按回车。如果能看到
function...的输出,而不是undefined,则说明配置成功。
⚠️ 重要提醒
CSS 样式引入:请务必确认已经按照之前提到的方法,正确引入了
vue-plugin-hiprint的打印样式文件,否则设计器样式会错乱。代码修改:配置成功后,你的
PrintDesigner.vue中直接使用$的代码hiprint.PrintElementTypeManager.buildByHtml($(".ep-draggable-item"))应该就能正常工作了。版本兼容:如果使用 CDN,建议固定 jQuery 版本(如示例中的 3.6.0),避免因版本更新导致不兼容。
请优先尝试方案一,这是目前 Vite 生态下比较标准和优雅的解决方案。如果在配置过程中遇到任何具体的错误信息,可以随时提供给我,我再帮你分析。
如果内网环境,这里如何处理: <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>在内网环境下,不能依赖外网CDN,有几种可靠的解决方案,其优缺点和操作步骤对比如下:
| 方案 | 核心思路 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|---|
| 方案一:下载并托管jQuery文件 | 将jQuery文件下载到项目内,作为本地静态资源引用。 | 最稳定可靠,完全离线可用,符合内网安全规范。 | 需手动下载和管理文件版本。 | ★★★★★ (首选) |
| 方案二:使用 npm 包并调整 Vite 配置 | 依赖已安装的 npm 包,通过配置让Vite在构建时将其注入全局。 | 依赖由 npm 统一管理,版本更新方便。 | 配置稍复杂,需改动构建配置。 | ★★★★☆ |
| 方案三:手动设置全局变量 (方案二的简化版) | 在应用入口文件 (main.ts) 中,将import的 jQuery 显式挂载到window对象。 | 无需改动index.html或复杂Vite配置,最直接。 | 需要在所有用到$的组件之前执行。 | ★★★☆☆ |
✅ 方案一:下载并托管jQuery文件(推荐)
这是最符合内网环境、最简单稳定的方案。
操作步骤:
下载 jQuery 文件:
在能访问外网的机器上,访问 jQuery 官网 或直接使用链接:https://code.jquery.com/jquery-3.6.0.min.js,下载该.js文件。放入项目目录:
将下载好的jquery-3.6.0.min.js文件,放入你 Vue 项目的public目录下(例如public/libs/jquery/)。这是 Vite 约定存放静态资源的地方,该目录下的文件在构建时会原样复制到输出目录。修改
index.html引用:
打开public/index.html文件,将 CDN 链接改为指向你本地的路径:html
<!-- 修改前 --> <!-- <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> --> <!-- 修改后(假设文件放在 public/libs/jquery/ 下) --> <script src="/libs/jquery/jquery-3.6.0.min.js"></script>
路径说明:
/开头表示从网站根目录开始查找,Vite 开发服务器和最终构建都会正确映射到public目录。(可选)类型声明:
在你的全局类型声明文件(如src/env.d.ts)中,确保有对全局$和jQuery的声明:typescript
// src/env.d.ts interface Window { $: any; jQuery: any; } // 或者直接声明全局变量 declare const $: any; declare const jQuery: any;
🔧 方案二:使用 npm 包并调整 Vite 配置
如果你已经在项目里通过npm install jquery安装了 jQuery,此方案可以免去手动管理文件。
操作步骤:
确保已安装 jQuery:
bash
npm install jquery
配置
vite.config.ts以全局注入:
修改vite.config.ts,目的是在构建时将 jQuery 模块的导出,注入为全局的$和jQuery变量。typescript
// vite.config.ts import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [vue()], // 新增以下配置 resolve: { alias: { // 确保jQuery解析到正确的文件 jquery: 'jquery/dist/jquery.min.js', }, }, // 使用 rollup 配置进行全局注入 build: { rollupOptions: { external: ['jquery'], // 告诉 Rollup jQuery 是外部依赖 output: { globals: { jquery: '$' // 指定全局变量名 } } } }, // 在开发环境下也定义全局变量 define: { 'window.$': 'global.$', // 这个写法可能不通用,更推荐方案三的入口文件方式 } })请注意,仅通过 Vite 配置在开发环境下实现类似
ProvidePlugin的完美自动注入较为复杂,这通常需要借助插件。因此,更推荐结合方案三。结合方案三(关键):由于纯配置方式可能不完美,你很可能仍然需要按照下文“方案三”的步骤,在
main.ts中手动设置全局变量,以确保开发时可用。
📝 方案三:手动设置全局变量(最直接)
此方案不依赖index.html的<script>标签,而是通过应用代码本身解决。
操作步骤:
安装 jQuery:
bash
npm install jquery
修改应用入口文件 (
src/main.ts):
在main.ts文件的最顶部,添加以下代码:typescript
// src/main.ts import jquery from 'jquery' // 将 jQuery 挂载到全局 window 对象上 (window as any).$ = jquery (window as any).jQuery = jquery // 以下是你的应用的原有代码 import { createApp } from 'vue' import App from './App.vue' // ... createApp(App).mount('#app')更新类型声明(同方案一的第4步)。
这个方案的原理是:你的应用代码在浏览器中运行时,会先执行main.ts。当执行到挂载代码时,window.$和window.jQuery就被创建了。随后,当vue-plugin-hiprint的代码执行$(".ep-draggable-item")时,它从全局window对象上找到了这个函数,调用就能成功。
💡 总结与最终建议
对于内网环境,我给出一个清晰的决策路径:
如果你追求极致的稳定和简单,不想与构建工具纠缠,请选择【方案一】。这是最“傻瓜式”、最接近传统Web开发的方式,在任何环境下都绝对可靠。
如果你希望依赖由 npm 统一管理,并且可以接受稍微复杂的配置,请选择【方案三】,或在方案二的基础上必须结合方案三。这是目前 Vite 环境下最实际、最有效的解决方案。
无论选择哪个方案,完成后都请:
删除
index.html中旧的 CDN 引用(如果采用方案三则无需此步)。确保类型声明正确,避免 TypeScript 报错。
重启你的开发服务器(
npm run dev)。
实例操作:
环境:Vue3(^3.4.21)+ Vite(^6.3.6)
1、安装 jquery 和 vite-plugin-externals
npm install jquery --savenpm install vite-plugin-externals --save-dev2、配置vite.config.ts
// 引入插件 vite-plugin-externals 的 viteExternalsPlugin import { viteExternalsPlugin } from "vite-plugin-externals"; // https://vitejs.dev/config/ export default defineConfig({ // 插件配置 plugins: [ vue(), VueSetupExtend(), // 配置此插件以全局注入 jQuery viteExternalsPlugin({ // 将 import 的 jquery 替换为全局的 jQuery 变量 jquery: "jQuery" }), VueDevTools() ], }3、在入口文件 index.html 中 引入 jquey
将j query.min.js 拷贝到 public 目录下,再重命名为 jquery-3.7.1.min.js
index.html
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <link rel="icon" href="/lims.ico"> <link rel="stylesheet" type="text/css" media="print" href="/print-lock.css"> <script src="/jquery-3.7.1.min.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>%VITE_APP_TITLE%</title> </head> <body> <div id="app"></div> <script type="module" src="/src/main.ts"></script> </body> </html>4、在全局类型声明文件env.d.ts文件中声明全局 jQuery 和 $ 变量
env.d.ts
/// <reference types="vite/client" /> // ... // 声明全局 jQuery 和 $ 变量 interface Window { $: any; jQuery: any; } declare const $: any; declare const jQuery: any;