@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"]
}
⚠ 注意事项
-
不支持全局类型声明 :TS 类型检查仍然会报错。你需要在
global.d.ts
中添加类型声明或安装 vite-plugin-define-options 自动处理。 -
@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
实现自动引入useEffect
、useState
等,务必使用@vitejs/plugin-react
(Babel 版); -
@vitejs/plugin-react-swc
更适合对性能要求高、不依赖 Babel 插件生态的场景。
-
-
必须在
vite.config.ts
的plugins
数组中,放在 React 插件之后。