我在自己的项目中遇到了类似的问题。我们需要为不同的产品创建不同的构建版本,并且当然希望从包中省略无关代码。也许你会在这里找到有用的东西。
步骤1 - 使用变量创建新的构建定义
{
scripts: {
"build:first": "SET TYPE=first && npm run build",
"build:second": "SET TYPE=second && npm run build"
}
}
注意 - 我正在使用
SET SOME_VARIABLE=XXXX
来提供构建的环境变量。
第二步:将您的共享文件拆分为多个文件:
/shared/first.tsx
export const firstMethod = () => "I AM A FIRST";
/shared/second.tsx
export const secondMethod = () => "I AM A SECOND";
步骤三-更新你的导入并将它们指向特定的文件
// first.tsx
import { firstMethod } from "./shared/first";
export default () => <> First Component says: {firstMethod()} </>;
// second.tsx
import { secondMethod } from "./shared/second";
export default () => <> Second Component says: {secondMethod()} </>;
最后一步 - 使用If-Else、环境变量和React.lazy加载你的入口点
let LazyComponent: React.LazyExoticComponent<() => JSX.Element>;
if (process.env.TYPE === "first") {
LazyComponent = React.lazy(() => import("./first"));
} else {
LazyComponent = React.lazy(() => import("./second"));
}
class App extends Component {
render() { return <LazyComponent />; }
}
现在,如果你运行npm run build:first
并检查打包文件,你会看到:
- First.tsx和Second.tsx组件被分别放入它们自己的块中。
- 我们从共同文件中移出的函数会被内联到相关的块中。
- 未使用的函数不会存在于生成的文件中。