詳細使用@rollup/plugin-inject的方式

@rollup/plugin-inject 是一個 Rollup 插件,它允許你在構建時自動注入模塊中的變量引用,避免手動在每個文件中 import。Vite 使用的是 Rollup 構建底層,因此該插件在 Vite 項目中也適用。

一、使用場景

比如你希望在代碼中不手動寫 import { useEffect } from 'react',而是像這樣直接寫:

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

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

二、安裝插件

pnpm install @rollup/plugin-inject -D

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

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)

// 你不需要再寫: 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

// 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

{"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 插件之后

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82120.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82120.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82120.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Day 0017:Web漏洞掃描(OpenVAS)解析

一、NVT腳本解析&#xff1a;漏洞檢測的“DNA” 1. NVT腳本結構 每個NVT腳本都是一個Lua腳本&#xff0c;包含以下核心模塊&#xff1a; lua -- 示例&#xff1a;檢測Apache HTTPd 2.4.49路徑穿越漏洞&#xff08;CVE-2021-41773&#xff09; script_id "1.3.6.1.4.1.…

【HarmonyOS Next之旅】DevEco Studio使用指南(二十六) -> 創建端云一體化開發工程

目錄 1 -> 創建HarmonyOS應用工程 1.1 -> 新建工程 1.1.1 -> 前提條件 1.1.2 -> 選擇模板 1.1.3 -> 配置工程信息 1.1.4 -> 關聯云開發資源 1.2 -> 工程初始化配置 1.2.1 -> 自動開通云開發服務 1.3 -> 端云一體化開發工程目錄結構 1.3.1…

Python 包管理工具 uv

Python 包管理工具 uv 是由 Astral 團隊&#xff08;知名工具 Ruff 的開發者&#xff09;基于 Rust 開發的新一代工具&#xff0c;旨在通過高性能和一體化設計革新 Python 生態的依賴管理體驗。以下是其核心特性、優勢及使用指南的全面解析&#xff1a; 一、uv 的核心優勢 極致…

何謂第二大腦?讀書筆記

2025/05/11 發表想法 每個人都是矛盾結合體&#xff0c;既想學到新知識、新的能力&#xff0c;又想沒辦法專注的學習&#xff0c;既無法專注有渴望學習新技能&#xff0c;逐漸會產生焦慮、失眠等負面癥狀&#xff0c;這就是現實社會現照&#xff0c;那怎么辦&#xff1f;我們能…

動態防御體系實戰:AI如何重構DDoS攻防邏輯

1. 傳統高防IP的靜態瓶頸 傳統高防IP依賴預定義規則庫&#xff0c;面對SYN Flood、CC攻擊等常見威脅時&#xff0c;常因規則更新滯后導致誤封合法流量。例如&#xff0c;某電商平臺遭遇HTTP慢速攻擊時&#xff0c;靜態閾值過濾無法區分正常用戶與攻擊者&#xff0c;導致訂單接…

為什么在設置 model.eval() 之后,pytorch模型的性能會很差?為什么 dropout 影響性能?| 深度學習

在深度學習的世界里&#xff0c;有一個看似簡單卻讓無數開發者困惑的現象&#xff1a; “為什么在訓練時模型表現良好&#xff0c;但設置 model.eval() 后&#xff0c;模型的性能卻顯著下降&#xff1f;” 這是一個讓人抓耳撓腮的問題&#xff0c;幾乎每一個使用 PyTorch 的研究…

[爬蟲知識] http協議

相關爬蟲專欄&#xff1a;JS逆向爬蟲實戰 爬蟲知識點合集 爬蟲實戰案例 引言&#xff1a;爬蟲與HTTP的不解之緣 爬蟲作用&#xff1a;模擬瀏覽器請求網頁為何要懂HTTP&#xff1a;http是網絡通信的基石&#xff0c;爬蟲抓取數據就是通過HTTP協議進行的&#xff0c;了解http有…

《Spark/Flink/Doris離線實時數倉開發》目錄

歡迎加入《Spark/Flink/Doris離線&實時數倉開發》付費專欄&#xff01;本專欄專為大數據工程師、數據分析師及準備大數據面試的求職者量身打造&#xff0c;聚焦Spark、Flink、Doris等核心技術&#xff0c;覆蓋離線與實時數倉開發的全流程。無論你是想快速上手項目、提升技術…

事務基礎概念

事務 事務是什么&#xff1f; 事務是一種機制&#xff0c;一個操作序列&#xff0c;包含了一組數據庫操作命令&#xff0c;并且把所有命令作為一個整體一起向系統提交或者撤銷操作請求&#xff0c;即統一這組命令要么一起執行&#xff0c;要么一起不執行 簡短概況就是&#…

四、【API 開發篇 (上)】:使用 Django REST Framework 構建項目與模塊 CRUD API

【API 開發篇 】&#xff1a;使用 Django REST Framework 構建項目與模塊 CRUD API 前言為什么選擇 Django REST Framework (DRF)&#xff1f;第一步&#xff1a;創建 Serializers (序列化器)第二步&#xff1a;創建 ViewSets (視圖集)第三步&#xff1a;配置 URLs (路由)第四步…

【北京盈達科技】GEO優化中的多模態了解

多模態數據處理領域&#xff0c;“模態”指的是不同類型的數據形式&#xff0c;每種模態都具有獨特的結構和信息表達方式。以下是12種可能的模態類型&#xff0c;這些模態在實際應用中可以根據具體場景進行組合和處理&#xff1a; 1. 文本模態 描述&#xff1a;以文字形式存在…

推進可解釋人工智能邁向類人智能討論總結分享

目錄 一、探索“可解釋人工智能”&#xff1a;AI如何從“黑箱”走向“透明大師” 二、走進可解釋人工智能&#xff1a;讓AI的決策變得透明 &#xff08;一&#xff09;幾種常見的特征導向方法 &#xff08;二&#xff09;像素級方法 1. 層次相關傳播&#xff08;LRP&#…

【Qt】Qt 5.9.7使用MSVC2015 64Bit編譯器

環境 Qt版本&#xff1a;5.9.7 VS版本&#xff1a;VS2022 步驟 1、安裝VS2022 三個必選項&#xff1a; a、使用C的桌面開發 b、Windows10 SDK 版本&#xff1a;10.0.18362.0 c、MSVC v140 VS 2015 生成工具 Windows10 SDK安裝完成后&#xff0c;需要增加安裝調試器。 2…

超越OpenAI CodeX的軟件工程智能體:Jules

目前AI編碼代理&#xff08;coding agent&#xff09;領域正迅速崛起&#xff0c;Google推出了一款名為Jules的非同步編碼代理&#xff08;asynchronous coding agent&#xff09;&#xff0c;主要針對專業開發者&#xff0c;與傳統在開發環境中直接輔助編碼的Cursor或Windsurf…

springboot使用xdoc-report包導出word

背景&#xff1a;項目需要使用xdoc-report.jar根據設置好的word模版&#xff0c;自動填入數據 導出word 框架使用 我的需求是我做一個模板然后往里面填充內容就導出我想要的word文件&#xff0c;問了下chatgpt還有百度&#xff0c;最后選用了xdocreport這個框架&#xff0c;主…

CodeBuddy實現pdf批量加密

本文所使用的 CodeBuddy 免費下載鏈接&#xff1a;騰訊云代碼助手 CodeBuddy - AI 時代的智能編程伙伴 前言 在信息爆炸的時代&#xff0c;PDF 格式因其跨平臺性和格式穩定性&#xff0c;成為辦公、學術、商業等領域傳遞信息的重要載體。從機密合同到個人隱私文檔&#xff0c…

如何在PyCharm2025中設置conda的多個Python版本

前言 體驗的最新版本的PyCharm(Community)2025.1.1&#xff0c;發現和以前的版本有所不同。特別是使用Anaconda中的多個版本的Python的時候。 關于基于Anaconda中多個Python版本的使用&#xff0c;以及對應的Pycharm&#xff08;2023版&#xff09;的使用&#xff0c;可以參考…

STM32F103 HAL多實例通用USART驅動 - 高效DMA+RingBuffer方案,量產級工程模板

導言 《STM32F103_LL庫寄存器學習筆記12.2 - 串口DMA高效收發實戰2&#xff1a;進一步提高串口接收的效率》前陣子完成的LL庫與寄存器版本的代碼&#xff0c;有一個明顯的缺點是不支持多實例化。最近&#xff0c;計劃基于HAL庫系統地梳理一遍bootloader程序開發。在bootloader程…

【數據結構】棧和隊列(上)

目錄 一、棧&#xff08;先進后出、后進先出的線性表&#xff09; 1、棧的概念及結構 2、棧的底層結構分析 二、代碼實現 1、定義一個棧 2、棧的初始化 3、入棧 3、增容 4、出棧 5、取棧頂 6、銷毀棧 一、棧&#xff08;先進后出、后進先出的線性表&#xff09; 1、…

Vue 3 官方 Hooks 的用法與實現原理

Vue 3 引入了 Composition API&#xff0c;使得生命周期鉤子&#xff08;hooks&#xff09;在函數式風格中更清晰地表達。本篇文章將從官方 hooks 的使用、實現原理以及自定義 hooks 的結構化思路出發&#xff0c;全面理解 Vue 3 的 hooks 系統。 &#x1f4d8; 1. Vue 3 官方生…