You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Chrome扩展中用Vite集成react-router-dom时遇依赖错误求助

在React+Vite构建的Chrome扩展中使用react-router-dom时遇到依赖错误

我在开发基于React的Chrome扩展,尝试用react-router-dom实现路由,但构建时出现依赖错误。已经试过用MemoryRouter和history包,问题依旧。

内容脚本代码

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./src/App";
import "./src/index.css";
import {
  createMemoryRouter,
  RouterProvider,
  Route,
  Link,
} from "react-router-dom";

const router = createMemoryRouter([
  {
    path: "/",
    element: (
      <div>
        <h1>Hello World</h1>
        <Link to="about">About Us</Link>
      </div>
    ),
  },
  {
    path: "about",
    element: <div>About</div>,
  },
]);

let isReactAppAdded = false;  

function removeExistingReactApp() {
  const existingElements = document.querySelectorAll('#tubechat-ai');

  existingElements.forEach((element) => {
    try {
      element.remove();
    } catch (error) {
      console.log("Error in removal ", error.message);
    }
  });
}

function addReactApp() {
  const sideBox_inner = document.getElementById("secondary-inner");
  const videoDurationElements = document.getElementsByClassName('ytp-time-duration');

  console.log("videoBootom",videoDurationElements[0].textContent)
  
  if (sideBox_inner && !isReactAppAdded) { 
    removeExistingReactApp()

    const app = document.createElement("div");
    app.id = "tubechat-ai";
    sideBox_inner.insertBefore(app, sideBox_inner.firstChild);
    ReactDOM.createRoot(document.getElementById("tubechat-ai")!).render(
      <RouterProvider router={router} />
    );

    isReactAppAdded = true
  } else {
    console.log("Not all required elements are present.");
  }
}

document.addEventListener("yt-navigate-finish", addReactApp);
document.addEventListener("DOMContentLoaded", addReactApp);

Vite配置文件

import { resolve } from 'path'
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

export default defineConfig({
  plugins: [react()],
  define: {
    'process.env': {}
  },
  build: {
    outDir: resolve(__dirname, 'dist'),
    lib: {
      formats: ['iife'],
      entry: [
        resolve(__dirname, './content.tsx'),
      ],
      name: 'Conntent-Script Vite Configuration'
    },
    
    rollupOptions: {
      output: {
        entryFileNames: '[name].js',
        extend: true,
      }
    }
  }
})

错误说明

构建终端出现依赖相关错误,推测问题出在Vite与react-router-dom的配合上。


解决方案

1. 调整Rollup依赖处理逻辑

react-router-dom的内部依赖在IIFE构建模式下可能无法正常解析,需要在Vite配置的rollupOptions中添加全局变量映射,并指定依赖入口:

rollupOptions: {
  output: {
    entryFileNames: '[name].js',
    extend: true,
    // 映射react和react-dom到全局变量,避免重复打包
    globals: {
      react: 'React',
      'react-dom': 'ReactDOM'
    }
  },
  resolve: {
    // 直接指定react-router-dom开发版入口,解决Rollup解析问题
    alias: {
      'react-router-dom': 'react-router-dom/dist/react-router-dom.development.js'
    }
  }
}

2. 切换构建格式为ES模块

IIFE格式不适用于react-router-dom的复杂依赖树,改用ES模块并同步更新Chrome扩展配置:
修改Vite的build.lib.formats:

build: {
  outDir: resolve(__dirname, 'dist'),
  lib: {
    formats: ['es'],
    entry: [resolve(__dirname, './content.tsx')],
    name: 'Content-Script Vite Configuration'
  },
  rollupOptions: {
    output: {
      entryFileNames: '[name].js'
    }
  }
}

更新manifest.json的content_scripts配置:

"content_scripts": [
  {
    "matches": ["https://*.youtube.com/*"],
    "js": ["dist/content.js"],
    "type": "module"
  }
]

3. 确保依赖完整安装

执行命令安装react-router-dom及相关依赖:

npm install react-router-dom history

4. 迁移路由逻辑到组件内部

将路由初始化移到App组件中,避免内容脚本顶层执行导致的加载问题:
src/App.tsx:

import { createMemoryRouter, RouterProvider, Route, Link } from "react-router-dom";

export default function App() {
  const router = createMemoryRouter([
    {
      path: "/",
      element: (
        <div>
          <h1>Hello World</h1>
          <Link to="about">About Us</Link>
        </div>
      ),
    },
    {
      path: "about",
      element: <div>About</div>,
    },
  ]);
  return <RouterProvider router={router} />;
}

内容脚本中简化渲染逻辑:

ReactDOM.createRoot(document.getElementById("tubechat-ai")!).render(<App />);

内容的提问来源于stack exchange,提问作者GAUTAM SARAWAGI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 20:45:10