webpack 如何处理多个文件导入同一个module React

IT技术 reactjs webpack
2021-04-01 13:31:56

我有一个 React 应用程序,它有许多组件导入相同的module。webpack 是否为每个请求它的文件导入每个module一次,导致重复的代码(在这种情况下,每个module只为两个组件导入两次)?我正在考虑重新编写组件,以便子组件不需要 React module,但也许我正在解决一个不存在的问题。如果导致重复代码,我想避免多次导入相同的 react module。

组件 1

import React from "react";
import { Link } from "react-router";
import ReactLogo from "elements/ReactLogo";

export default class MainMenu extends React.Component {
    render() {
        return <div>
            <ReactLogo type="svg" /> <ReactLogo type="png" /> <ReactLogo type="jpg" />
            <h2>MainMenu:</h2>
            <ul>
                <li>The <Link to="home">home</Link> page.</li>
                <li>Do something on the <Link to="todo">todo page</Link>.</li>
                <li>Switch to <Link to="some-page">some page</Link>.</li>
                <li>Open the chat demo: <Link to="chat" params={{room: "home"}}>Chat</Link>.</li>
                <li>Open the page that shows <Link to="readme">README.md</Link>.</li>
            </ul>
        </div>;
    }
}

组件 2 导入相同的 3 个module。

import React from "react";
import { Link } from "react-router";
import ReactLogo from "elements/ReactLogo";

export default class MainMenu extends React.Component {
    render() {
        return <div>
            <ReactLogo type="svg" /> <ReactLogo type="png" /> <ReactLogo type="jpg" />
            <h2>MainMenu:</h2>
            <ul>
                <li>The <Link to="home">home</Link> page.</li>
                <li>Do something on the <Link to="todo">todo page</Link>.</li>
                <li>Switch to <Link to="some-page">some page</Link>.</li>
                <li>Open the chat demo: <Link to="chat" params={{room: "home"}}>Chat</Link>.</li>
                <li>Open the page that shows <Link to="readme">README.md</Link>.</li>
            </ul>
        </div>;
    }
}
1个回答

不,webpack(类似于 browserify 和其他module打包器)只会打包一次。

每个 react 组件都有自己的作用域,当它需要/导入另一个module时,webpack 将检查所需的文件是否已经包含在包中。

所以不,它不会导致重复的代码。但是如果你导入一些外部打包的库,你可能会有一些重复的代码。在这种情况下,您可以使用 Webpack 的重复数据删除插件来查找这些文件并进行重复数据删除。更多信息在这里:https : //github.com/webpack/docs/wiki/optimization#deduplication

对不起,但我正在处理这个问题,我的代码被多次包含在内。不知道怎么修 我在 es6 中的所有文件都有 200kb 大小(全部一起),我的“捆绑”文件有 1.3mb @trekforever
2021-05-27 13:31:56
那么 React 是否在每个导入它的组件上重复?
2021-06-05 13:31:56
为什么然后在每个文件中重复导入?
2021-06-08 13:31:56
@DejanMilosevic 因为每个文件都维护自己的上下文,所以它不知道捆绑的所有其他文件在其中包含什么或它们做什么。这并不意味着每个文件都会因为重复的代码而变得臃肿,webpack 会照顾到这一点。
2021-06-09 13:31:56
@jrodriguez 如果您的文件中都有相同的代码但仍然是单独的文件,它们将占用所有空间。如果您有一个包含所有代码的文件并将其导入到其他 6 个文件中,则它们不会重复所有代码,而是引用回原始条目。
2021-06-11 13:31:56