值得一看
广告
彩虹云商城
广告

热门广告位

基于 Mantine UI 构建组件库时 useContext 报错的解决方案

基于 mantine ui 构建组件库时 usecontext 报错的解决方案

本文档旨在解决在使用 Mantine UI 构建可复用组件库并在其他项目中引入时,遇到的 TypeError: Cannot read properties of null (reading ‘useContext’) 错误。该错误通常与模块编译方式有关。通过修改 TypeScript 配置文件,将 CommonJS 编译方式改为 ESM,可以有效解决此问题,并确保组件库的正常使用。

问题描述

在使用 Mantine UI 作为基础,构建自己的组件库并发布到 npm 后,在另一个 React 项目中使用该组件库时,可能会遇到以下错误:

TypeError: Cannot read properties of null (reading 'useContext')

这个错误通常表明 Mantine UI 相关的 Context 在组件树中没有正确提供。尽管你在使用组件库的项目中已经包裹了 MantineProvider,但问题依然存在。

问题分析

根本原因在于组件库的编译方式。如果你的组件库使用 TypeScript 编译为 CommonJS (CJS) 模块,则可能会导致在使用组件库的项目中,Mantine UI 的 Context 无法正确传递。这是因为 CJS 和 ESM 模块在处理依赖关系的方式上有所不同,可能导致 Context 丢失。

解决方案:将组件库编译为 ESM

解决此问题的关键是将组件库编译为 ECMAScript 模块 (ESM)。这可以通过修改组件库的 tsconfig.json 文件来实现。

修改 tsconfig.json

打开组件库的 tsconfig.json 文件,并进行如下修改:

{
"exclude": ["node_modules"],
"include": ["src"],
"compilerOptions": {
"module": "ES2020", // 将 module 设置为 ESM 相关的值,例如 "ES2020", "ESNext"
"declaration": true,
"outDir": "dist/esm",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"removeComments": true,
"strict": true,
"skipLibCheck": true,
"jsx": "react",
"moduleResolution": "node",
"lib": ["dom", "es2016", "esnext.asynciterable"],
"sourceMap": true,
"declarationDir": "dist/types"
}
}

关键配置项解释:

DeepSeek

DeepSeek

幻方量化公司旗下的开源大模型平台

DeepSeek7087

查看详情
DeepSeek

  • module: 将其设置为 “ES2020” 或 “ESNext”,指定 TypeScript 编译器生成 ESM 模块。
  • outDir: 指定 ESM 模块的输出目录,例如 “dist/esm”。
  • esModuleInterop: 设置为 true,允许 CommonJS 模块和 ES 模块之间的互操作。

重新编译组件库

在修改 tsconfig.json 后,重新编译组件库。确保编译输出目录(例如 dist/esm)包含 ESM 格式的模块文件。

重新发布组件库

将重新编译后的组件库发布到 npm。

在使用组件库的项目中更新依赖

在使用组件库的项目中,更新组件库的依赖,并确保安装的是最新版本。

示例代码

以下是一个简单的 Mantine UI 组件示例,用于验证解决方案:

import React from "react";
import { Button as MantineButton } from "@mantine/core";
import PropTypes from "prop-types";
const ButtonTest = ({ label, backgroundColor = "red", handleClick }) => {
const style = {
backgroundColor,
border: "none",
padding: "10px",
};
return (
<div>
<MantineButton onClick={handleClick} style={style}>
{label}
</MantineButton>
</div>
);
};
ButtonTest.propTypes = {
label: PropTypes.string,
backgroundColor: PropTypes.string,
handleClick: PropTypes.func,
};
export default ButtonTest;

确保在使用此组件的项目中,已经正确引入并使用了 MantineProvider。

注意事项

  • 确保你的 TypeScript 版本是最新的,以支持最新的 ESM 特性。
  • 在更新组件库依赖后,清除 node_modules 目录并重新安装依赖,以避免缓存问题。
  • 检查构建工具(例如 webpack, rollup)的配置,确保它们正确处理 ESM 模块。

总结

通过将组件库编译为 ESM 模块,可以有效解决在使用 Mantine UI 构建组件库时遇到的 useContext 报错问题。这种方法确保了 Mantine UI 的 Context 在组件树中正确传递,从而保证了组件库的正常运行。 记住,在修改配置后,一定要重新编译、发布并更新依赖。

相关标签:

react js json node typescript 工具 red typescript json ecmascript npm webpack NULL 并发 ui

大家都在看:

在React/Next.js项目中正确引入和显示图片的指南
React应用中图片加载与路径管理:公共目录的最佳实践
在React应用中正确加载和显示图片的教程
在React/Next.js应用中正确引入和显示图片教程
在React/Next.js中正确引入和显示图片:理解Public目录与路径
温馨提示: 本文最后更新于2025-09-13 22:39:49,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞11赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容