Вопрос
Я создаю библиотеку компонентов пользовательского интерфейса для повторного использования в моих проектах. Библиотека написана на TypeScript и .less с 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
и выводю его в папку dist
в другой папке с именем модуля. Затем я обрабатываю файлы объявлений TypeScript и отправляю их в эту структуру папок. С файлом index. js в папке root я импортирую каждый модуль из их папки и экспортирую его как именованный модуль, используя общий синтаксис js.
// ./index.js
exports.Span = require('./dist/Span').Span;
exports.Tag = require('./dist/Tag').Tag;
В пакете. json Я объявляю files
моего npm модуля как [ "/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?
Спасибо!
Примечание: мой веб-пакет conf:
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', '/**/*')],
}),
],
};