详细使用@rollup/plugin-inject的方式

@rollup/plugin-inject 是一个 Rollup 插件,它允许你在构建时自动注入模块中的变量引用 ,避免手动在每个文件中 import。Vite 使用的是 Rollup 构建底层,因此该插件在 Vite 项目中也适用。

一、使用场景

比如你希望在代码中不手动写 import { useEffect } from 'react',而是像这样直接写:

javascript 复制代码
useEffect(() => {
  console.log('mounted');
}, []);

只要你在 vite.config.ts 中通过 @rollup/plugin-inject 配置好 useEffect,就能自动注入。

二、安装插件

javascript 复制代码
pnpm install @rollup/plugin-inject -D

三、完整使用示例(vite.config.ts

javascript 复制代码
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import inject from '@rollup/plugin-inject';
import path from 'path';

export default defineConfig({
  plugins: [
    react(),
    inject({
      React: 'react',
      useState: ['react', 'useState'],
      useEffect: ['react', 'useEffect'],
      useRef: ['react', 'useRef'],
      useMemo: ['react', 'useMemo'],
      useCallback: ['react', 'useCallback'],
      useContext: ['react', 'useContext'],
      useNavigate: ['react-router-dom', 'useNavigate'],
      useLocation: ['react-router-dom', 'useLocation'],
      useTranslation: ['react-i18next', 'useTranslation'],
      message: ['antd', 'message'],
      notification: ['antd', 'notification'],
      _: 'lodash',
      dayjs: 'dayjs',
    }),
  ],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, './src'),
    },
  },
});

四、示例代码(无需 import)

javascript 复制代码
// 你不需要再写: import React, { useEffect } from 'react'

function Demo() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log('mounted');
  }, []);

  return <div>{count}</div>;
}

五、搭配 TypeScript 全局声明使用(防止 TS 报错)

创建文件 src/global.d.ts

javascript 复制代码
// React
declare const React: typeof import('react');
declare const useState: typeof import('react')['useState'];
declare const useEffect: typeof import('react')['useEffect'];
declare const useRef: typeof import('react')['useRef'];
declare const useMemo: typeof import('react')['useMemo'];
declare const useCallback: typeof import('react')['useCallback'];
declare const useContext: typeof import('react')['useContext'];

// React Router
declare const useNavigate: typeof import('react-router-dom')['useNavigate'];
declare const useLocation: typeof import('react-router-dom')['useLocation'];

// i18n
declare const useTranslation: typeof import('react-i18next')['useTranslation'];

// Ant Design
declare const message: typeof import('antd')['message'];
declare const notification: typeof import('antd')['notification'];

// 工具库
declare const _: typeof import('lodash');
declare const dayjs: typeof import('dayjs');

六、tsconfig.json 配置

确保 global.d.ts 被 TypeScript 编译器加载。修改你的 tsconfig.json

javascript 复制代码
{
  "compilerOptions": {
    "target": "ESNext",
    "lib": ["DOM", "DOM.Iterable", "ESNext"],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": false,
    "forceConsistentCasingInFileNames": true,
    "module": "ESNext",
    "moduleResolution": "Node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "react-jsx",
    "noEmit": true,
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  },
  "include": ["src", "src/global.d.ts"],
  "exclude": ["node_modules"]
}

⚠ 注意事项

  1. 不支持全局类型声明 :TS 类型检查仍然会报错。你需要在 global.d.ts 中添加类型声明或安装 vite-plugin-define-options 自动处理。

  2. @vitejs/plugin-react-swc 不支持 @rollup/plugin-inject(SWC 编译不走 Rollup transform)❌。

    • 只能配合 @vitejs/plugin-react 使用 ✅。

    • 不能同时在 plugins 中使用这两个插件,否则会有冲突;

    • @vitejs/plugin-react-swc 是基于 SWC 的替代构建器,比 Babel 更快,但不支持 @rollup/plugin-inject 这类需要 AST 转换的功能;

    • 如果你需要使用 inject 实现自动引入 useEffectuseState 等,务必使用 @vitejs/plugin-react(Babel 版);

    • @vitejs/plugin-react-swc 更适合对性能要求高、不依赖 Babel 插件生态的场景。

  3. 必须在 vite.config.tsplugins 数组中,放在 React 插件之后

相关推荐
@大迁世界5 分钟前
1.什么是 ReactJS?
前端·javascript·react.js·前端框架·ecmascript
阿贵---23 分钟前
C++中的RAII技术深入
开发语言·c++·算法
Traced back29 分钟前
怎么用 Modbus 让两个设备互相通信**,包含硬件接线、协议原理、读写步骤,以及 C# 实操示例。
开发语言·c#
BJ-Giser1 小时前
Cesium 基于EZ-Tree的植被效果
前端·可视化·cesium
王码码20352 小时前
Flutter for OpenHarmony:Flutter 三方库 algoliasearch 毫秒级云端搜索体验(云原生搜索引擎)
android·前端·git·flutter·搜索引擎·云原生·harmonyos
发现一只大呆瓜2 小时前
深入浅出 AST:解密 Vite、Babel编译的底层“黑盒”
前端·面试·vite
娇娇yyyyyy2 小时前
QT编程(17): Qt 实现自定义列表模型
开发语言·qt
天天鸭2 小时前
前端仔写了个 AI Agent,才发现大模型只干了 10% 的活
前端·python·ai编程
ms_27_data_develop2 小时前
Java枚举类、异常、常用类
java·开发语言