首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用rollup捆绑为esm时,React未定义

在使用 Rollup 打包为 ESM(ECMAScript 模块)时,如果遇到 React is not defined 的错误,通常是因为 Rollup 没有正确处理 React 的导入。以下是一些基础概念和相关解决方案:

基础概念

  1. ESM (ECMAScript Modules):
    • ESM 是 JavaScript 的官方模块系统,使用 importexport 关键字。
  • Rollup:
    • Rollup 是一个 JavaScript 模块打包器,主要用于构建库和应用程序。
  • React:
    • React 是一个用于构建用户界面的 JavaScript 库。

可能的原因

  1. 缺少 React 和 ReactDOM 的导入:
    • 确保在代码中正确导入了 React 和 ReactDOM。
  • Rollup 插件配置问题:
    • 可能需要配置 Rollup 插件来正确处理 React 的导入。

解决方案

1. 确保正确导入 React 和 ReactDOM

在你的入口文件或需要使用 React 的文件中,确保有以下导入语句:

代码语言:txt
复制
import React from 'react';
import ReactDOM from 'react-dom';

2. 配置 Rollup 插件

你需要使用 @rollup/plugin-node-resolve@rollup/plugin-commonjs 插件来处理 CommonJS 模块,并确保 Rollup 能够找到 React 和 ReactDOM。

以下是一个基本的 Rollup 配置示例:

代码语言:txt
复制
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import babel from '@rollup/plugin-babel';

export default {
  input: 'src/index.js',
  output: {
    file: 'dist/bundle.js',
    format: 'esm',
  },
  plugins: [
    resolve(),
    commonjs(),
    babel({ babelHelpers: 'bundled' }),
  ],
};

3. 使用 Babel 转译

确保你已经安装并配置了 Babel,以便正确转译 React 代码。你可以使用 @rollup/plugin-babel 插件。

安装必要的依赖:

代码语言:txt
复制
npm install --save-dev @rollup/plugin-babel @babel/core @babel/preset-react

然后在你的 Babel 配置文件(例如 .babelrc)中添加 React 预设:

代码语言:txt
复制
{
  "presets": ["@babel/preset-react"]
}

示例代码

假设你有一个简单的 React 组件:

代码语言:txt
复制
// src/index.js
import React from 'react';
import ReactDOM from 'react-dom';

function App() {
  return <h1>Hello, World!</h1>;
}

ReactDOM.render(<App />, document.getElementById('root'));

确保你的 Rollup 配置如上所示,并且所有必要的插件都已正确安装和配置。

应用场景

这种配置适用于需要将 React 应用程序打包为 ESM 模块的场景,例如构建库或需要在现代浏览器中直接使用的应用程序。

通过以上步骤,你应该能够解决 React is not defined 的问题,并成功使用 Rollup 打包你的 React 应用程序为 ESM 格式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Vite 2.0 正式发布!

当我们还在为假期余额不足而烦恼时,尤大在做些什么? ? ? 网友: ? ? ?...一个构建命令,它将代码与 Rollup 捆绑在一起,后者预先配置为输出用于生产的高度优化的静态资产 此外,Vite 通过其插件 API 和 JavaScript API 具有高度的扩展性,并提供全面的类型支持...为了了解 Vite 的速度有多快,这里有一个视频比较了使用 Vite vs. create-React-app (CRA) 应用程序的过程: 关于Vite2 这实际上是 Vite 的第一个稳定版本。...Pre-Bundling Esbuild 因为 Vite 是一个本地的 ESM dev 服务器,使用Pre-Bundling以减少浏览器请求的数量并处理 CommonJS 到 ESM 的转换 在之前,...Vite 使用 Rollup 完成这项工作,而在2.0中,它现在使用 esbuild,从而使依赖性预绑定的速度提高了「10-100」倍 作为参考,React Meterial 用户界面以前需要28秒,现在需要约

83830

Vue3 中的脚手架工具Vite到底牛在哪, 一文全知道

Vite 是一个由原生 ESM 驱动的 Web 开发构建工具,在开发环境下基于浏览器原生 ES imports 开发,在生产环境下基于 Rollup 打包。 今天,我们一起来了解一下这个新成员吧。...Vite 的背景与工作方式 在过去Webpack、Rollup 等构建工具作为主场明星时,Vue 的代码都是基于 ES Module 规范去写的。...捆绑生产时,Vite附带了一个预配置的构建命令,该命令可以立即进行许多性能优化。...通过使用它,我们可以快速启动Vue或React项目,而无需再使用Vue CLI或Create React App。高效、快速就是它的代名词。...Vite消除了两个工具和插件的捆绑,并新增了很多友好的默认设置,甚至可以跳过配置并直接开始工作。 如果我们有特定的需求,Vite允许我们自行设置,可以覆盖Rollup和各种Rollup插件的配置。

1.9K30
  • 拥抱 Vite2.0 系列(一)

    入门 概述 Vite(法语为 fast,发音为/vit/)是一种构建工具,旨在为现代Web项目提供更快,更精简的开发体验。...一个构建命令,将您的代码与Rollup捆绑在一起,该Rollup已预先配置为输出高度优化的静态资源进行生产。...浏览器支持 对于开发:需要本地ESM动态导入支持。 对于生产:默认构建针对通过script标签支持本机ESM的浏览器。...react-ts preact preact-ts lit-element lit-element-ts index.html 和项目根 您可能已经注意到的一件事是,在Vite项目中,index.html...Vite还能够处理解析为根目录以外的文件系统位置的依赖项,即使在基于Monorepo的设置中也可以使用。 指定备用根 运行vite时以当前工作目录为根目录启动开发服务器。

    83610

    NPM 组件你应该知道的事

    产生方式: rollup 声明 target 为 esm 或者 babel 编译之后生成一个新的目录 (iceworks 的做法) package.json 中声明 module,指向 esm 使用方式...引入 浏览器通过 requirejs 或 seajs 引入 【目前这个已经很少使用了】 如何产生 rollup 或者 webpack 声明 target 为 umd package.json 中声明...unpkg,指向对应文件 commonjs 使用方式 node 端, npm 方式 如何产生 rollup 或者 webpack 声明 target 为 commonjs package.json 中声明...external 对于打包成 umd 的文件,由于它无法分析是否存在 peerDependencies, 所以如果使用方已有 react、 react-dom 等库,需要在webpack打包时,将 external...尽可能提供 esm 模式,并且如果这个组件没有影响外部变量时,设置 sideEffect 为 false, 让使用方可以最大的 tree-shaking 。

    1.6K20

    新一代构建工具(1):对比rollupparcelesbuild—esbuild脱颖而出

    esbuild: 强调性能,内置了对css、图片、react、typescript等内置支持,编译速度特别快(是webpack和rollup速度的100倍+),缺点是目前插件系统较为简单,生态不如webpack...rollup的问题对CommonJS的兼容问题因为rollup原生只支持ESM模块的bundle,因此如果实际业务中需要对commonjs进行bundle,第一步就是需要将CJS转换成ESM,不幸的是,...由于所有线程共享内存,因此当捆绑导入同一JavaScript库的不同入口点时,可以轻松地共享工作。大多数现代计算机具有多内核,因此并行性是一个巨大的胜利。...节录官方文件的说法:使用封装工具应该是您想要使用,而不是必须要使用。首次提出利用浏览器原生ESM能力的工具并非是Vite,而是一个叫做Snowpack的工具。...一些教学还处于编写中,已完成的像React 教学 就非常清楚。另外Snowpack 似乎以Svelete 为第一优先。

    2.7K20

    ESModule 系列 (二):构建下一代基础设施 PDN

    这两种导入导出方式不能混用,若错误使用,浏览器底层会直接抛出错误,而在 CJS 中,由于导出的值一直是一个对象,所以通过 require 引入模块时,是不会抛出语法错误的(除非模块不存在)。...React } }) export default ReactLib [React的ESM转化] 可以看到,React 的 cjs 代码经过 Rollup 或者 Esbuild 转化之后,会直接被编译成只有一个默认导出的模块...,通过这样的转化,在使用 React 时,会与我们常规的使用习惯有所冲突。...的过程中,分发网络通常会使用 Rollup 等工具,将依赖包的源代码全部打包到一起,最后提供一个 ESM 单文件,这样可以显著的减少网络请求量(比如,请求 antd 包,如果不打包源码,可能需要递归引入...而由于 ESM 包的分发服务对每个包的处理是将包的源码进行打包,因此在文件数量上会呈现数十倍的下降;而打包结果会永久存储到CDN上,等于一次安装,永久使用,相较于本地npm安装依赖时每次都需要下载依赖的整个

    1.3K20

    渐进式 Unbundled 开发工具探索之路

    浏览器中直接使用可能会污染全局变量,以及容易被修改覆盖。 很多公司内部包,并没有提供 UMD 产物。 既然 UMD 产物不太符合我们的场景,那么直接替换依赖为对应的 ESM 产物呢?...以 React 为例, 直接从云端下载的 ESM 产物内容截图如下: ? 可以看到依赖项 object-assign 会额外带有版本号信息。...针对 monorepo 中某些 package 并不发布,在应用中直接使用源码统一构建的场景, 在分析使用到的依赖时,也会收集这些 package 用到的依赖,统一预处理成 ESM 格式。...遇到的一些问题举例如下: esbuild 不支持 React 17 jsx transformer,inject 配置选项 transform api 也没有提供,当业务项目使用 React 版本为 17.../react.js"; node_modules/.web_modules 目录就是我们在依赖预处理时生成的第三方依赖 ESM 文件目录。

    1.4K30

    Rollup 基本概念及使用

    { external: ['react', 'react-dom'] } 在 SSR 构建或者使用 ESM CDN 的场景中,这个配置将非常有用 2.5 接入插件 在Rollup的日常使用中,我们难免会遇到一些...这个时候就需要我们引入相应的Rollup插件了。接下来以一个具体的场景为例带大家熟悉一下Rollup插件的使用。...你可能会说,那我们直接在项目中统一使用ESM规范就可以了啊,这有什么问题呢?需要注意的是,我们不光要考虑项目本身的代码,还要考虑第三方依赖。...目前为止,还是有不少第三方依赖只有CommonJS格式产物而并未提供ESM产物,比如项目中用到lodash时,打包项目会出现这样的报错: 所以,我们需要引入额外的插件去解决这个问题,我们需要安装两个核心的插件包...是为了允许我们加载第三方依赖,否则像import React from ‘react’ 的依赖导入语句将不会被 Rollup 识别。

    1.1K62

    构建工具tsup入门第二部分

    就没有使用 ESBuild 的 tree shaking 而是选用了 Rollup; 那么想要在 tsup 正确开启 tree shaking 就是下面的两种方式: 终端执行时开启: cd code03...捆绑模块的格式: 前端模块化主流的 esm、cjs、iife 都是 tsup 支持的将模块进行捆绑的格式,在 tsup 中默认使用 iife 格式。...在一次编译时输出多种模块格式的结果: cd code04 && npx tsup index.js --format esm,cjs,iife 输出结果的文件名和格式存在如下对应关系:...文件中 type 被标记为 module 时将发生下面的变化: dist ├── index.js # esm ├── index.global.js # iife └── index.cjs...在由 esbuild 将代码编译为 es2020 后由 SWC 接管语法降级部分再次编译降级为 es5 语法; 总结 这一节的内容就到此结束了,代码压缩、模块拆分、树摇、捆绑格式及目标环境要在实际的情况下考虑是否要开启和关闭

    75220

    js打包时间缩短90%,bundleless生产环境实践总结

    2.2 前端路由处理 前端路由我们直接使用react-router或者vue-router等,需要注意的时,如果是在开发环境,那么必须要指定在snowpack.config.mjs配置文件,在刷新时让匹配到前端路由...只对每一个文件都做一些简单的模块处理(将非js模块转化成js模块)和语法处理,因此天然支持按需加载,snowpack支持React.lazy的写法,在react的项目中,只要正常使用React.Lazy...我们安装一个npm包时,我们以安装ramda为例: npx snowpack ramda 复制代码 在snowpack.deps.json中会生成: { "dependencies": {...不同的是在dev环境 snowpack是通过rollup来将node_modules的包,重新进行esm形式的编译 vite则是通过esbuild来将node_modules的包,重新进行esm形式的编译...而snowpack默认就是unbundle的,这种unbundle的默认形式,对构建工具就没有要求,对于线上环境,即可以使用rollup,也可以使用webpack,甚至可以选择不打包,直接使用unbundle

    92700

    Rollup打包基本概念及使用--vite

    依赖 external对于某些第三方包,有时候我们不想让 Rollup 进行打包,也可以通过 external 进行外部化:{ external: ['react', 'react-dom']}在 SSR...构建或者使用 ESM CDN 的场景中,这个配置将非常有用,具体细节我们会在高级应用这一章展开。...这个时候就需要我们引入相应的 Rollup 插件了。接下来以一个具体的场景为例带大家熟悉一下 Rollup 插件的使用。...目前为止,还是有不少第三方依赖只有 CommonJS 格式产物而并未提供 ESM 产物,比如项目中用到 lodash 时,打包项目会出现这样的报错 因此,我们需要引入额外的插件去解决这个问题。...是为了允许我们加载第三方依赖,否则像import React from 'react' 的依赖导入语句将不会被 Rollup 识别。

    71430

    从零打造组件库

    当 ​webpack​ 或者 ​rollup​ 在加载 ​npm​ 包的时候,如果看到有 ​module​ 字段,会优先加载 ​esm​ 入口文件,因为可以更好的做 ​tree-shaking​,减小代码体积...所以这里选用 ​rollup​ 负责打包 ​umd​ 文件,入口为 ​component/index.tsx​,输出 ​format​ 为 ​umd​ 格式。...一个组件库只有 ​JS​ 文件肯定不够用,还需要有样式文件,比如使用 ​Antd​ 时: import { DatePicker } from 'antd'; import 'antd/dist/antd.css...导出 ​cjs​ 或者 ​esm​,意味着模块化导出,并不是一个聚合的 ​JS​ 文件,而是每个组件是一个模块,只不过 ​cjs​ 的代码时符合 ​Commonjs​ 标准,​esm​ 的代码时 ​ES...组件文档 这里使用 docz 来搭建文档站点,更具体的使用方法大家可以阅读官网文档,这里不再赘述。

    1.7K10

    发布、传输和安装现代 JavaScript 以实现更快的应用程序

    /legacy.cjs" } 具有传统回退的现代代码和 ESM 捆绑程序优化 除了定义回退 CommonJS 入口点,还可以使用 "module" 字段指向类似的传统回退捆绑包,但该捆绑包使用 JavaScript...,当以现代 ES 模块环境为目标时,这些捆绑包会省略不必要的包装函数。...这也将 webpack 配置为使用 加载代码拆分捆绑包。...它还可以比涉及两个编译步骤的传统解决方案更快,同时仍然为现代和旧版浏览器生成单独的捆绑包。这两套捆绑包设计为使用模块/无模块模式加载。...Rollup Rollup 内部支持生成多组捆绑包作为单个版本的一部分,并默认生成现代代码。因此,可以将 Rollup 配置为通过您可能已经在使用的官方插件生成现代和传统捆绑包。

    1K20

    向现代JavaScript转型——发布、传输和安装现代 JavaScript以实现更快的应用程序

    /legacy.cjs" } 具有传统回退的现代代码和 ESM 捆绑程序优化 除了定义回退 CommonJS 入口点,还可以使用 "module" 字段指向类似的传统回退捆绑包,但该捆绑包使用 JavaScript...,当以现代 ES 模块环境为目标时,这些捆绑包会省略不必要的包装函数。...这也将 webpack 配置为使用 加载代码拆分捆绑包。...它还可以比涉及两个编译步骤的传统解决方案更快,同时仍然为现代和旧版浏览器生成单独的捆绑包。这两套捆绑包设计为使用模块/无模块模式加载。...Rollup Rollup 内部支持生成多组捆绑包作为单个版本的一部分,并默认生成现代代码。因此,可以将 Rollup 配置为通过您可能已经在使用的官方插件生成现代和传统捆绑包。

    2.7K185

    新一代构建工具的比较

    无论我们使用 webpack、 Rollup 还是 Parcel 作为开发服务器,这个工具都将我们的整个代码库与源代码和一个 node _ modules 文件夹捆绑在一起,通过 Babel、 TypeScript...这是因为它需要知道在构建时使用 React 和 ReactDOM 的哪个版本。你可以通过写一个 snowpack.deps.json 来解决这个问题,它可以通过运行以下命令自动创建: ....您可能不希望在构建时使用 Rollup (我们已经讨论过 esbuild 的速度有多快) ,或者您可能希望您的工具能够为您提供 Babel、 eslint 以及开箱即用的 webpack 装载器生态系统的全部功能...Vue 模板为单个文件组件引入了 Vue 插件,为 JSX 引入了 Vue 插件。React 模板引入了 React-refresh 插件。无论哪种方式,都将为您提供热模块替换和客户端状态保存。...这个版本带有我们期望的 Rollup 特性: 捆绑、缩小和摇树。

    2.3K20

    拥抱 Vite2.0 系列(二)

    特征 在最基本的层次上,使用Vite进行开发与使用静态文件服务器没有太大区别。但是,Vite对本机ESM导入提供了许多增强功能,以支持通常在基于捆绑程序的设置中常见的各种功能。...Vite将在所有服务的源文件中检测此类裸模块导入,并执行以下操作: 预捆绑它们以提高页面加载速度,并将CommonJS / UMD模块转换为ESM。...JSX编译也通过ESBuild处理,默认使用React 16风格。这里跟踪ESBuild中React 17风格的JSX支持。...如果没有将JSX与React或Vue一起使用,可以使用esbuild选项配置自定义jsxFactory和jsxFragment。...这导致了额外的网络往返: Entry ---> A ---> C Vite使用预加载步骤自动重写代码分割动态导入调用,这样当a请求时,C被并行获取: Entry ---> (A + C) C可能有进一步的导入

    3.3K30

    Rollup

    什么是Rollup rollup.js是Javascript的ES模块打包器,我们熟知的Vue、React等诸多知名框架或类库都通过rollup.js进行打包。...在我们学习Vue和React等框架源码或者自己编写Javascript类库时,rollup.js是一条必经之路。...Rollup 的好处 Tree Shaking: 自动移除未使用的代码, 输出更小的文件 Scope Hoisting: 所有模块构建在一个函数内, 执行效率更高 Config 文件支持通过 ESM 模块格式书写...: 转换 CJS -> ESM, 通常配合上面一个插件使用 rollup-plugin-replace: 类比 Webpack 的 DefinePlugin , 可在源码中通过 process.env.NODE_ENV...开发者可以在你的应用或库中使用ES2015模块,然后高效地将它们打包成一个单一文件用于浏览器和Node.js使用。 Rollup最令人激动的地方,就是能让打包文件体积很小。

    1.7K20

    【前端工程化】Rollup构建工具

    一、什么是Rollup Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,例如 library 或应用程序 —— Rollup文档 可以理解为,Rollup是一款集成式的代码打包...(如果要为应用程序创建一个捆绑包,您可能想要使用它,因为它会使文件大小变小。)...、cjs、esm等格式的package) 官方提供了一个权威的三方插件参考列表:https://github.com/rollup/awesome ,因此有什么想要增强能力的需要,可以现在该列表中检索...以Less处理器为例子,我们需要安装:rollup-plugin-less yarn add rollup-plugin-less -D 使用例子: import { rollup } from 'rollup...「4.6 更多插件」 其实还有很多的插件,其用法如上部分罗列的插件,可见Rollup的使用及上手成本还是相对比较低的,其Tree-shaking是一大亮点,react框架就是用rollup打包的,Rollup

    2K41
    领券