Мы создаем несколько приложений и решили перенести все наши общие компоненты в библиотеку npm. Мы создаем эти компоненты с машинописью, S CSS и реагируем. Поскольку приложение стало более масштабным, у нас возникают проблемы с размером сборки.
Мой вопрос заключается в том, как мы можем добиться наилучшей оптимизации и минимизации реагирующих компонентов в виде библиотеки npm.
Ниже приведены мои конфигурации веб-пакетов,
// THIS IS THE COMMON CONFIGURATION FOR DEVELOPMENT AND PRODUCTION ENVIRONMENT
const commonPaths = require("./common-paths");
const commonRules = require("./common-rules");
const webpack = require("webpack");
const CaseSensitivePathsPlugin = require("case-sensitive-paths-webpack-plugin");
const {CleanWebpackPlugin} = require('clean-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
module.exports = {
mode: "none",
resolve: {
extensions: [".js", ".ts", ".tsx", ".json"]
},
entry: {
index: [
commonPaths.polyFillsPath,
commonPaths.eventPolyFills,
commonPaths.projectRoot
]
},
module: commonRules,
plugins: [
new CleanWebpackPlugin(),
new CaseSensitivePathsPlugin(),
new webpack.WatchIgnorePlugin([
/\.js$/,
/\.d\.ts$/
]),
new CopyWebpackPlugin([
{ from: 'src/delivery-tracking/_assets/img/', to: 'delivery-tracking/_assets/gen/img/' },
{ from: 'src/extras-card/_assets/img/', to: 'extras-card/_assets/gen/img/' },
{ from: 'src/modal/_assets/img/', to: 'modal/_assets/gen/img/' },
{ from: 'src/progress-overlay/_assets/img/', to: 'progress-overlay/_assets/gen/img/' },
{ from: 'src/chat/_assets/img/', to: '_assets/gen/img/' },
])
]
};
// THIS IS THE CONFIGURATION FOR RUNNING COMPONENTS ON LOCAL MACHINE (MOCK)
const webpack = require("webpack");
const commonPaths = require("./common-paths");
const commonRules = require("./common-rules");
const {CleanWebpackPlugin} = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
module.exports = {
mode: "development",
devtool: "cheap-eval-source-map",
resolve: {
extensions: [".js", ".ts", ".tsx", ".json"]
},
entry: {
"mock-index": [
commonPaths.polyFillsPath,
commonPaths.eventPolyFills,
commonPaths.projectRoot + "/common-js-page/index.tsx"
]
},
output: {
filename: "[name].js",
libraryTarget: "var"
},
module: commonRules,
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
template: './src/common-js-page/index.html'
}),
new webpack.DefinePlugin({
MODE: JSON.stringify("mock"),
MOCK_URL: JSON.stringify("http://localhost:5000/priorityOffers"),
VISION_MOCK: JSON.stringify("http://localhost:5000/visionOffers"),
VIEW_ALL_OFFERS_URL: JSON.stringify(""),
BACK_TO_HOME_URL: JSON.stringify(""),
APPLICATION_BASE_URL: JSON.stringify("")
}),
new CopyWebpackPlugin([
{ from: 'src/delivery-tracking/_assets/img/', to: 'delivery-tracking/_assets/gen/img/' },
{ from: 'src/extras-card/_assets/img/', to: 'extras-card/_assets/gen/img/' },
{ from: 'src/modal/_assets/img/', to: 'modal/_assets/gen/img/' },
{ from: 'src/progress-overlay/_assets/img/', to: 'progress-overlay/_assets/gen/img/' },
{ from: 'src/chat/_assets/img/', to: '_assets/gen/img/' },
])
]
};
// WEBPACK DEVELOPMENT
const webpack = require("webpack");
const path = require("path");
module.exports = {
mode: "development",
devtool: "cheap-eval-source-map",
externals: {
// Don't bundle react or react-dom
'react': 'commonjs react',
'react-dom' : 'commonjs react-dom'
},
resolve: {
alias: {
'react': path.resolve(__dirname, './node_modules/react'),
'react-dom': path.resolve(__dirname, './node_modules/react-dom')
}
},
plugins: [
new webpack.DefinePlugin({
MODE: JSON.stringify("development"),
MOCK_URL: JSON.stringify(""),
VISION_MOCK: JSON.stringify(""),
VIEW_ALL_OFFERS_URL: JSON.stringify(""),
BACK_TO_HOME_URL: JSON.stringify(""),
APPLICATION_BASE_URL: JSON.stringify("")
})
]
};
// WEBPACK PRODUCTION
const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
const CompressionPlugin = require("compression-webpack-plugin");
const OptimizeCSSAssets = require("optimize-css-assets-webpack-plugin");
const webpack = require("webpack");
const path = require("path");
module.exports = {
mode: "production",
optimization: {
minimizer: [new UglifyJsPlugin()]
},
resolve: {
alias: {
'react': path.resolve(__dirname, './node_modules/react'),
'react-dom': path.resolve(__dirname, './node_modules/react-dom')
}
},
externals: {
// Don't bundle react or react-dom
'react': 'commonjs react',
'react-dom' : 'commonjs react-dom'
},
plugins: [
new OptimizeCSSAssets(),
new webpack.DefinePlugin({
MODE: JSON.stringify("production"),
MOCK_URL: JSON.stringify(""),
VISION_MOCK: JSON.stringify(""),
VIEW_ALL_OFFERS_URL: JSON.stringify(""),
BACK_TO_HOME_URL: JSON.stringify(""),
APPLICATION_BASE_URL: JSON.stringify("")
})
]
};
Использование объединения веб-пакетов для объединения этих файлов.
const webpackMerge = require("webpack-merge");
const commonConfig = require("./build-utils/webpack.common");
module.exports = ({ mode = "production", addons = [] }) => {
const flatAddons = [].concat(...[addons]);
const addonConfigs = flatAddons.map(addon =>
require(`./build-utils/webpack.${addon}`)
);
const modeConfig = require(`./build-utils/webpack.${mode}`);
if( mode === "mock") {
return webpackMerge(modeConfig, ...addonConfigs);
} else {
return webpackMerge(commonConfig, modeConfig, ...addonConfigs);
}
console.log("\n ************** MERGED webpack config ******** ");
console.log(mergedConfig);
console.log("********************************************* \n")
};
Общие правила конфигурации веб-пакетов:
const outputPath = '_assets/gen/img/';
const publicPath = '_assets/gen/img/';
module.exports = {
rules: [
{
test: /\.(png|jpg|jpeg|gif|woff|woff2|eot|ott|ttf|ottf|svg)(\?v=\d+.\d+.\d+)?$/,
loader: "file-loader",
options: {
name: "[name].[ext]",
outputPath: outputPath,
publicPath: publicPath
},
exclude: ["/node_modules/", "/src/"]
},
{
test: /\.tsx?$/,
loader: 'ts-loader',
exclude: ["/node_modules/","./"]
},
{
test: /\.scss$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
importLoaders: 1,
sourceMap: true,
url: false
}
},
{
loader: 'sass-loader',
options: {
sourceMap: true,
}
}
]
}
]
};
Пожалуйста, поделитесь оптимальным способом сделать это.