【发布时间】:2026-01-09 08:40:01
【问题描述】:
问题
我正在构建一个 UI 组件库以在我的项目中重复使用。该库是用 TypeScript 和 React 的 .less 编写的,并使用 WebPack 构建。
.
├── README.md
├── dist
├── index.js
├── package-lock.json
├── package.json
├── src
│ ├── Span
│ │ ├── Span.less
│ │ └── index.tsx
│ └── Tag
│ ├── Tag.less
│ └── index.tsx
├── tsconfig.json
├── types
│ └── custom.d.ts
└── webpack.config.js
每个组件都被导出为一个命名模块。在 WebPack 中,我将每个 .ts 文件作为一个条目,将其传递给 ts-loader 并将其输出到另一个文件夹中的 dist 文件夹,其中包含模块的名称。然后我处理 TypeScript 声明文件并将它们发送到这个文件夹结构。
使用根文件夹中的 index.js 文件,我从其文件夹中导入每个模块,并使用 commonjs 语法将其导出为命名模块。
// ./index.js
exports.Span = require('./dist/Span').Span;
exports.Tag = require('./dist/Tag').Tag;
在 package.json 中,我将我的 npm 模块的 files 声明为 [ "/dist", "index.js" ];因此,发布的 npm 模块将是:
.
├── dist
│ ├── Span
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ └── index.js.map
│ └── Tag
│ ├── index.d.ts
│ ├── index.js
│ └── index.js.map
└── index.js
最后,我可以从我的客户端代码中将这些组件导入为命名模块,例如:
// client code
import { Span, Tag } from 'components_library_example';
我的问题是:
-
目前没有加载css文件。
- 我的客户端代码无法读取内联的 css 代码有什么原因吗?
- 另一种解决方案是使用
MiniCssExtractPlugin提取css,并从index.js导入样式;理论上很容易,但实际上,这似乎是不可能的。有什么好的方法吗?
-
目前,当我导入组件时,打字稿无法识别声明文件,因此我丢失了所有类型。
- ¿如何导出
index.js中的模块以保持对 .d.ts 声明文件的访问?
- ¿如何导出
谢谢!
注意:我的 webpack 配置文件:
const path = require('path');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const nodeExternals = require('webpack-node-externals');
module.exports = {
name: 'server',
entry: {
Span: path.join(__dirname, 'src/Span/index.tsx'),
Tag: path.join(__dirname, 'src/Tag/index.tsx'),
},
output: {
filename: '[name]/index.js',
path: path.join(__dirname, 'dist'),
libraryTarget: 'commonjs2',
globalObject: "(typeof self !== 'undefined' ? self : this)",
library: 'MyLib',
umdNamedDefine: true,
},
target: 'node',
devtool: '#source-map',
externals: [nodeExternals(), 'react'],
resolve: {
extensions: ['.js', '.jsx', '.ts', '.tsx', '.svg'],
},
module: {
rules: [
{
test: /\.(js|jsx|ts|tsx)$/,
loader: ['ts-loader'],
exclude: /node_modules/,
},
{
test: /\.(less|css)$/,
use: ['css-loader', 'less-loader'],
},
{
test: /\.svg$/,
use: ['@svgr/webpack'],
},
],
},
stats: 'errors-only',
plugins: [
new CleanWebpackPlugin({
dry: false,
verbose: true,
protectWebpackAssets: false,
cleanOnceBeforeBuildPatterns: [path.join(__dirname, 'dist', '/**/*')],
}),
],
};
【问题讨论】:
标签: javascript reactjs typescript webpack redux