在 Vite项目中,使用插件 @rollup/plugin-inject 注入全局 jQuery

写在前面

在一次项目脚手架升级的过程中,将之前基于 webpack 搭建的项目移植到 Vite 构建。

一些组件库是依赖 jQuery 的,如:Bootstrap;引入这些组件的时候,需要项目中已经存在 jQuery 环境。

例如:当我们在 main.js 中使用如下方式引入 Bootstrap 时:

// main.js
/* bootstarp */
import '@/assets/css/bootstrap.min.css'
import '@/assets/js/bootstrap.min.js'

我们必须保证拥有全局的 jQuery 环境。否则,在 Bootstrap 中会报缺少 jQuery 的错误。

在原项目中,在 webpack.base.conf.js 中,有一段关于 jQuery 的配置是这样的:

module.exports = {
  ...
  plugins: [
    new webpack.ProvidePlugin({
      $: "jquery",
      jQuery: "jquery",
      "windows.jQuery": "jquery"
    })
  ],
  ...
}

使用 webpack.ProvidePlugin 插件全局注入 jQuery,这样在项目构建启动运行后,项目中就有了全局的 jQuery 环境。

那么,在 Vite 的项目中,该如何来配置或者来实现这个功能呢?

方法一、全局静态引入

全局静态引入的意思,就是在项目的主页面文件 index.html 中,使用原始引入 js 文件的方式来引入 jquery

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vite-Vue3</title>
    <script src="/src/jquery.min.js"></script>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.js"></script>
  </body>
</html>

方法二、使用插件 @rollup/plugin-inject 注入 jquery

首先,安装 jquery@rollup/plugin-inject.

npm i jquery @rollup/plugin-inject -S

在项目的配置文件 vite.config.js 中:

import inject from '@rollup/plugin-inject'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    inject({
      $: "jquery",  // 这里会自动载入 node_modules 中的 jquery
      jQuery: "jquery",
      "windows.jQuery": "jquery"
    })
  ],
  resolve: {
    alias: {
      '@': resolve(__dirname, './src')
    }
  }
})

这样,即可在 Vite 项目中实现 webpack.ProvidePlugin 的功能。

课外知识:

一、关于 webpack.ProvidePlugin

  • 了解 webpack 的插件使用方式:
// webpack.base.conf.js
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  ...
  plugins: [
    new webpack.ProvidePlugin({}),
    new webpack.IgnorePlugin('/^\.\/locale$/, /moment$/'),
    // or(或者)
    new HtmlWebpackPlugin({
      template: './src/index.html'
    })
  ]
  ...
}

这里面有两种 webpack 的插件使用方式:new webpack.ProvidePlugin()new HtmlWebpackPlugin();

前者是 webpack 内置的模块,后者不是 webpack 内置的模块,需要使用 npm 先进行安装再使用。

  • ProvidePlugin,是 webpack 的内置模块。
  • 使用 ProvidePlugin 加载的模块在使用时将不再需要 importrequire 进行引入。
  • jquery 为例,用 ProvidePlugin 进行实例初始化后,jquery 就会被自动加载并导入对应的 node 模块中。
new webpack.ProvidePlugin({
  $: 'jquery',
  jQuery: 'jquery'
})

// 然后我们可以在代码中直接使用

$('#item'); // <= just works
jQuery('#item'); // <= just works
// $ is automatically set to the exports of module "jquery"

二、使用 @rollup/plugin-node-resolve 解决模块之间引用问题

使用 @rollup/plugin-node-resolve 解决模块之间引用问题。

—————————— 【正文完】——————————

前端学习交流群,想进来面基的,可以加群: 832485817685486827
前端顶级学习交流群(一) 前端顶级学习交流群(二)

写在最后: 约定优于配置 —— 软件开发的简约原则

——————————【完】——————————

我的:
个人网站: https://neveryu.github.io/neveryu/
Github: https://github.com/Neveryu
微信: miracle421354532

更多学习资源请关注我的微信…好吗

我在进行组件库和项目link软连接的时候出现了在项目使用组件无法显示的问题(在组件库测试的时候可以正常显示)下方是我组件库的打包文件import { rollup } from &#39;rollup&#39; import { resolve } from &#39;path&#39; import vue from &#39;@vitejs/plugin-vue&#39; import { nodeResolve } from &#39;@rollup/plugin-node-resolve&#39; import esbuild from &#39;rollup-plugin-esbuild&#39; import commonjs from &#39;@rollup/plugin-commonjs&#39; import glob from &#39;fast-glob&#39; import type { TaskFunction } from &#39;gulp&#39; import type { Plugin } from &#39;rollup&#39; //项目根目录 const projRoot = resolve(__dirname, &#39;..&#39;, &#39;..&#39;, &#39;..&#39;,&#39;..&#39;) //包目录 const pkgRoot = resolve(projRoot, &#39;packages&#39;) //输出目录 const epOutput = resolve(projRoot,&#39;dist&#39;) //打包入口文件过滤 export const excludeFiles = (files: string[]) => { const excludes = [&#39;node_modules&#39;, &#39;mock&#39;, &#39;gulpfile&#39;, &#39;dist&#39;] return files.filter(path => !excludes.some(exclude => path.includes(exclude))) } export const buildModules:TaskFunction = async () =>{ const input = excludeFiles( await glob(&#39;**/*.{js,ts,vue}&#39;, { cwd: pkgRoot, absolute: true, onlyFiles: true }) ) const plugins: Plugin[] = [ nodeResolve({ extensions: [&#39;.mjs&#39;, &#39;.js&#39;, &#39;.json&#39;, &#39;.ts&#39;] }), esbuild(), commonjs(), vue() ] const bundle = await rollup({ input, plugins, external: [&#39;vue&#39;,/@vue/g] //这里我们先写死,因为我们组件目前比较简单 }) bundle.write({ format: &#39;esm&#39;, //输出的模块格式 dir: resolve(epOutput, &#39;es&#39;), //输出的目录 preserveModules: true, //保持原模块的目录结构,而不是打包成一个文件 preserveModulesRoot: pkgRoot, //指定根目录,这里我们先指定我们的组件目录, entryFileNames: `[name].mjs` //输出为 `.mjs`,name是入口 }) }下方是package.json文件{ "name": "build", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "gulp --require @esbuild-kit/cjs-loader -f gulpfile.ts" }, "keywords": [], "author": "", "license": "ISC", "packageManager": "pnpm@10.15.1", "dependencies": { "@esbuild-kit/cjs-loader": "^2.4.4", "@rollup/plugin-commonjs": "^28.0.6", "@rollup/plugin-node-resolve": "^16.0.1", "@vitejs/plugin-vue": "^6.0.1", "fast-glob": "^3.3.3", "gulp": "^4.0.2", "rollup": "^4.50.1", "rollup-plugin-esbuild": "^6.2.1" } } 请告诉我解决的详细操作如果需要别的文件代码请告诉我
10-16
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值