我正在创建一个库,它可以导出大量的React组件,以及一些用于公司内多个项目的TypeScript实用程序。但是,除了从库的根目录导出所有内容之外,我似乎不能做任何其他事情。
我有以下文件夹结构。.tsx 和 utils.ts 文件仅导出命名属性,根 index.ts 文件包含export * from './Button';
等。然后src/index.ts
是export * from './ui'
,等等。
src/
ui/
Button/
Button.tsx
Input/
Input.tsx
index.ts
utils/
myUtilFunc1.ts
myUtilFunc2.ts
index.ts
字符串
使用下面的Webpack配置,
const path = require("path");
module.exports = {
entry: "./src/index.ts",
resolve: {
extensions: [".ts", ".tsx", ".js"],
},
output: {
path: path.resolve(__dirname, "dist"),
filename: "main.js",
library: "@company/library",
libraryTarget: "umd",
umdNamedDefine: true,
},
module: {
rules: [
{
test: /\.tsx?$/,
loader: "ts-loader",
exclude: /node_modules/,
},
],
},
externals: {
react: "react",
"react-dom": "react-dom",
},
};
型
以及以下package.json属性:
"main": "dist/main.js",
"module": "dist/main.js",
"types": "dist/types/index.d.ts",
型
当我在另一个项目中使用这个库时,我可以根据需要导入,如下所示:import { Button, myUtilFunc2 } from "@company/library"
个
但我想这样导入:import { Button } from "@company/library/ui"
和import {myUtilFunc2 } from "@company/library/util"
我知道这应该是可能的,因为MUI和其他库都有。我正在使用Webpack,因为我尝试了这将汇总,甚至使用Lerna设置monolithic repository(这工作得很好,但我只是觉得我不需要为此构建两个npm包,它们可以包含在一个包中)。
3条答案
按热度按时间nqwrtyyt1#
实现目标的一种可能方法是使用
package.json
文件中的exports字段,它允许您在使用import "package"
或import "package/sub/path"
等模块请求时声明应使用哪个模块。Webpack 5及更新版本支持此功能。例如,您可以在
package.json
中包含以下内容:字符串
这样,你可以像这样导入子模块:
型
根据webpack documentation:
当指定了exports字段时,只有这些模块请求可用。任何其他请求都将导致ModuleNotFound错误。
因此,如果您有太多的项目模块,这可能是乏味或不切实际的。
在这种情况下,您可以尝试使用一些语法功能,允许您指定多个或动态模块请求,例如:
要了解更多信息,请参阅Webpack 5通用语法,替代方案。
但它有一些兼容性问题。
您可以从this resource了解有关exports字段及其语法的更多信息。
ftf50wuq2#
您可以使用Webpackalias进行存档。
配置您的Webpack,将 @company 别名解析为组件所在的相应路径。这可以通过在Webpack配置中添加以下内容来完成:
字符串
但你需要确保遵循相同的结构:
型
那么这个应该行得通:
型
1mrurvl13#
要在从库中导入元件和实用程序时获得所需的文件夹结构,需要对项目的配置和文件结构进行一些调整。您可以使用Webpack配置中的resolve.alias属性为特定目录创建别名,以便可以直接导入它们。
以下是如何修改Webpack配置以实现所需的导入语法:
更新您的Webpack配置:
字符串
修改从src/index.ts导出的方式:
型
更新文件结构:
型
通过这些更改,您应该能够根据需要导入组件和实用程序:
型
这将为您提供所需的文件夹结构,同时将所有内容保留在单个npm包中。Webpack配置中的别名允许您使用@company/library导入路径,该路径指向库的根src目录。每个目录中的index.ts文件用于重新导出组件和实用程序,使它们可以从各自的文件夹中轻松访问。