如何通过<script>标签引入React组件?附远程JS打包疑问
在纯HTML页面通过
<script>引入React组件的实现方案 嘿,作为React新手能想到这种在纯HTML里复用组件的方式真的很棒!完全可以实现你想要的效果,我来一步步给你讲清楚:
一、能不能通过<script>标签引入自己的React组件?
当然可以!这和React官网提到的「把React添加到现有网站」的思路完全一致,甚至可以直接扩展到引入你自己的远程组件文件。
具体实现步骤
- 先引入React基础依赖(你的组件需要它们才能运行)
首先在HTML里通过CDN引入React和ReactDOM的核心脚本,如果你的组件用了JSX语法,还要引入Babel来实时转换JSX:<!-- React核心库 --> <script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script> <!-- ReactDOM渲染库 --> <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script> <!-- 转换JSX语法的Babel脚本 --> <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script> - 引入你的远程组件文件
把你写好的React组件保存为JS文件,上传到服务器后,用<script>标签引入。注意如果组件里用了JSX,要给标签加上type="text/babel":<!-- 引入你的远程组件 --> <script type="text/babel" src="https://your-server.com/path/to/your-component.js"></script> - 组件示例(
your-component.js内容)
你的组件文件里需要定义组件,并且把它渲染到页面的某个节点上:// 定义你的React组件 function GreetingButton() { return <button>Hello React!</button>; } // 找到页面上的挂载节点,渲染组件 const rootNode = document.getElementById('react-root'); const root = ReactDOM.createRoot(rootNode); root.render(<GreetingButton />); - 页面挂载节点
别忘了在HTML里加一个用来渲染React组件的容器:<div id="react-root"></div>
二、如何生成包含依赖的远程JS文件?
如果你不想让用户额外引入React、ReactDOM这些依赖,或者希望组件更独立,可以用构建工具把组件和依赖打包成一个单独的JS文件,这样只需要引入这一个文件就行。这里推荐两种方式:
方式1:快速测试用——手动整理+CDN依赖
如果你的组件很简单,依赖很少,可以直接把组件代码单独写成JS文件,依赖通过CDN引入(就像上面的例子)。这种方式适合快速验证,不需要复杂的构建流程,但依赖多了会显得繁琐。
方式2:生产环境推荐——用构建工具打包成UMD/IIFE文件
用Vite、Webpack这类构建工具,可以把你的组件和需要的依赖(比如React、ReactDOM)打包成一个独立的、可以通过<script>直接引入的文件。这里以Vite为例:
- 初始化一个React项目:
npm create vite@latest my-react-component -- --template react cd my-react-component npm install - 编写你的组件,比如在
src/MyComponent.jsx里:export default function MyComponent() { return <div>我是打包后的React组件!</div>; } - 修改
vite.config.js,配置打包为UMD格式(这种格式支持通过<script>标签引入):import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; export default defineConfig({ plugins: [react()], build: { lib: { entry: 'src/MyComponent.jsx', // 组件入口文件 name: 'MyComponent', // 全局变量名,引入后可以直接用 formats: ['umd'], // 打包格式选UMD fileName: () => 'my-component.js' // 输出的文件名 }, rollupOptions: { // 如果你想把React和ReactDOM一起打包进去,就把external设为空数组 // 如果不想打包,让用户自己引入CDN,就保留下面的配置 external: ['react', 'react-dom'], output: { // 定义全局变量映射,打包后会用全局的React/ReactDOM globals: { react: 'React', 'react-dom': 'ReactDOM' } } } } }); - 执行打包命令:
打包完成后,npm run builddist文件夹里的my-component.js就是你要的远程JS文件,把它上传到服务器就行。 - 引入打包后的组件:
- 如果打包时包含了React/ReactDOM:
<div id="react-root"></div> <script src="https://your-server.com/dist/my-component.js"></script> <script> const root = ReactDOM.createRoot(document.getElementById('react-root')); root.render(React.createElement(MyComponent)); </script> - 如果没打包依赖,还是需要先引入React的CDN脚本,再引入你的组件文件。
- 如果打包时包含了React/ReactDOM:
总结
完全可行!简单场景用CDN+单独组件文件就能快速实现,生产环境推荐用构建工具打包成独立文件,这样组件更稳定,加载效率也更高。
内容的提问来源于stack exchange,提问作者ggoulart
相关产品推荐
相关产品推荐

