Эта установка предполагает, что вы используете стилевые компоненты и не имеете css / scss.
Здесь важно то, что у вас есть "module": commonJS в вашем tsconfig и libraryTarget: "commonJS" в вашем веб-конфигурационном пакете,Externals говорит веб-пакету не связывать вашу библиотеку с React или React-DOM или стилевыми компонентами, а вместо этого искать те пакеты внутри проекта, в который вы импортируете.
, который вам также понадобитсявозьмите React, Reaction-Dom и Styled-компоненты из ваших зависимостей package.json и поместите их в ваши равноправные зависимости
const path = require("path");
const fs = require("fs");
const TerserPlugin = require('terser-webpack-plugin');
const appIndex = path.join(__dirname, "../src/main.tsx");
const appBuild = path.join(__dirname, "../storybook-static");
const { TsConfigPathsPlugin } = require('awesome-typescript-loader');
module.exports = {
context: fs.realpathSync(process.cwd()),
mode: "production",
bail: true,
devtool: false,
entry: appIndex,
output: {
path: appBuild,
filename: "dist/Components.bundle.js",
publicPath: "/",
libraryTarget: "commonjs"
},
externals: {
react: {
root: 'React',
commonjs2: 'react',
commonjs: 'react',
amd: 'react'
},
'react-dom': {
root: 'ReactDOM',
commonjs2: 'react-dom',
commonjs: 'react-dom',
amd: 'react-dom'
},
"styled-components": {
root: "styled-components",
commonjs2: "styled-components",
commonjs: "styled-components",
amd: "styled-components"
}
},
optimization: {
minimizer: [
new TerserPlugin({
terserOptions: {
parse: {
ecma: 8,
},
compress: {
ecma: 5,
warnings: false,
comparisons: false,
inline: 2,
},
mangle: {
safari10: true,
},
output: {
ecma: 5,
comments: false,
ascii_only: true,
},
},
parallel: true,
cache: true,
sourceMap: false,
})
],
},
resolve: {
extensions: [".web.js", ".mjs", ".js", ".json", ".web.jsx", ".jsx", ".ts", ".tsx"],
alias: {
"react-native": "react-native-web",
},
},
module: {
strictExportPresence: true,
rules: [
{ parser: { requireEnsure: false } },
{
test: /\.(ts|tsx)$/,
loader: require.resolve("tslint-loader"),
enforce: "pre",
},
{
oneOf: [
{
test: /\.(tsx?)$/,
loader: require.resolve('awesome-typescript-loader'),
options: {
configFileName: 'tsconfig.prod.json'
}
},
],
},
],
},
plugins: [
new TsConfigPathsPlugin()
],
node: {
dgram: "empty",
fs: "empty",
net: "empty",
tls: "empty",
child_process: "empty",
},
performance: false,
};
Примечание: важно, чтобы вы указали точку в вашем приложении какзапись, содержащая ТОЛЬКО компоненты, которые вы хотите экспортировать.
IE Для меня это Main.tsx, а внутри Main.tsx это выглядит так.
export { Checkbox } from "./components/Checkbox/Checkbox";
export { ColorUtils } from "./utils/color/color";
export { DataTable } from "./components/DataTable/DataTable";
export { DatePicker } from "./components/DateTimePicker/DatePicker/DatePicker";
export { DateTimePicker } from "./components/DateTimePicker/DateTimePicker/DateTimePicker";
export { Disclosure } from "./components/Disclosure/Disclosure";
Это означает, что webpack не будетсвязать вещи, которые вы не собираетесь экспортировать.Чтобы проверить, что вы работаете в связке, попробуйте импортировать что-то с синтаксисом require из комплекта, чтобы обойти типизацию и поверните allowJS true в tsconfig.
что-то вроде const Button = require ("../ path / to / js/bundle").Button console.log (кнопка);