![](/img/trans.png)
[英]CSS modules malformed using Webpack, Typescript and React?
[英]WebPack-React-TypeScript: loading CSS and exporting types
我正在構建一個 UI 組件庫以在我的項目中重用。 該庫使用 TypeScript 和 React 編寫,並使用 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
和 output 將其傳遞到另一個文件夾中的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 文件。
MiniCssExtractPlugin
提取 css,並從index.js
導入 styles; 理論上很容易,但實際上,這似乎是不可能的。 那里有什么好的方法嗎?目前,當我導入組件時,typescript 無法識別聲明文件,因此我丟失了所有類型。
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', '/**/*')],
}),
],
};
首先, webpack 不是最適合制作庫的工具目前,您的每個組件都包含大量重復的運行時內容。 將組件轉換為 es 模塊可能就足夠了,因為您可能會將它們捆綁為某些應用程序的一部分。
目前未加載 css 文件。 為什么我的客戶端代碼無法讀取內聯的 css 代碼?
您的 styles 包含在捆綁文件中,但不會應用。 Styles 應該以某種方式注入到頁面中,並且通常使用樣式加載。 注入是一種副作用,因此您的庫不會是可搖樹的。
根據您將如何使用該庫,我建議避免在組件和以下之一中導入 styles:
目前,當我導入組件時,typescript 無法識別聲明文件,因此我丟失了所有類型。 您可以在庫的根目錄中添加
index.d.ts
文件並重新導出那里的所有組件類型
export * from './src/Span';
export * from './src/Tag';
如果要將它們放在其他地方,則需要在 package.json 中指定types
字段
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.