reactjs - React 没有被使用,但仍然被合并到一个包中

标签 reactjs vite rollup dead-code

tldr;是什么阻止了 React 在我的项目中被消除死代码? 除了我正在使用的库中未使用的实用程序之外,它没有被使用。


我最近创建了a little library for retrying failing dynamic imports 。我制作了一个不依赖于 React 的模块和另一个仅处理 React 细节的模块。这是为了确保消费者在不使用 React utils 的情况下不会拉入 React。然后我创建了an index module将两者拉入并导出命名常量

import _createDynamicImportWithRetry from "./dynamic-import-with-retry";
import _reactLazy from "./react-lazy";

export const reactLazyWithRetry = _reactLazy;
export const createDynamicImportWithRetry = _createDynamicImportWithRetry;

这是 package.json 中的 main 字段。

我从之前的阅读中假设,当 Vite 使用这个库时,它应该能够收集到仅导入命名导出 createDynamicImportWithRetry 只需要引入“./dynamic” -import-with-retry”,而不是其他导入。不幸的是,情况似乎并非如此:我 published a project这表明情况并非如此:传递性 React 依赖项正在被捆绑,无论它是否未使用。

我假设生产捆绑期间的死代码分析会修剪树中未使用的导入。如何确保修剪枯枝?

复制:

mkdir tmp-proj && cd tmp-proj && mkdir src

echo '<script type="module" src="./src/index.js"></script>' > index.html

echo "import * as o from '@fatso83/retry-dynamic-import'
o.reactLazyWithRetry( () => Promise.resolve())" > src/index.js

npm i @fatso83/retry-dynamic-import; npm i vite

npx vite build 

vite v4.3.5 building for production...
✓ 13 modules transformed.
dist/index.html                0.08 kB │ gzip: 0.09 kB
dist/assets/index-4e07d3ed.js  9.27 kB │ gzip: 3.89 kB

9KB有问题。它应该接近 500 字节,但它引入了所有 React 生产构建:/

最佳答案

您必须告诉您使用的任何捆绑程序,该 react 应该由您的库的客户端提供,即。它不应该与您的库捆绑在一起。这称为外部化

要大致了解如何在 package.json 和 bundler 中完成此操作,您可以查看我的 previous answer using Rollup 。如果您使用的是Vite,则外部化为 even simpler to configure .

关于reactjs - React 没有被使用,但仍然被合并到一个包中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76243750/

相关文章:

javascript - react 汇总 : 'name' is not exported by node_modules/

vue.js - 仅在构建时添加 Vue3 和 TailwindCSS 前缀

reactjs - Vite + React + Flask 不代理前端到后端

javascript - 隐藏 react-google-maps 上的默认全屏按钮

reactjs - 在 React 中测试 mapbox-gl 时如何修复 'window.URL.createObjectURL is not a function'?

reactjs - vite@4.x + ant@3.x + React@16 : Unknown theme type: undefined, 名称错误:未定义

CSS 模块和汇总 - 生成具有相同哈希值的单独 CSS 文件 ("themes"

websocket - 带有 subscriptions-transport-ws 的 Rollup 和 Apollo websocket

javascript - 为什么我的占位符不会出现在 TextInput 中

javascript - 当我调用 React.useState() 返回的更新函数时会发生什么?