nightingale1/web/config/webpack.dll.config.js

104 lines
2.6 KiB
JavaScript

const path = require('path');
const fs = require('fs');
const babel = require('@babel/core');
function getImportedAntCptNamesByDirPath(dirPath) {
function union(a, b) {
return Array.from(new Set([...a, ...b]));
}
function kebabCase(str) {
return str.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\s+/g, '-').toLowerCase();
}
function getImportedAntCptNamesByFilePath(filePath) {
const fileContent = fs.readFileSync(filePath, {
encoding: 'utf8',
});
const importedAntCptNames = [];
babel.transformSync(fileContent, {
sourceType: 'module',
presets: [
require.resolve('@babel/preset-react'),
],
plugins: [
'@babel/plugin-proposal-class-properties',
{
visitor: {
ImportDeclaration(path) {
const { node } = path;
if (!node) return;
const { value } = node.source;
node.specifiers.forEach((spec) => {
if (value === 'antd') {
importedAntCptNames.push(spec.local.name);
}
});
},
},
},
],
});
return importedAntCptNames;
}
function getFilesPathByDirPath(dirPath) {
const filesPath = [];
function make(dirPath) {
const files = fs.readdirSync(dirPath, {
withFileTypes: true,
});
files.forEach((fileDirent) => {
if (fileDirent.isFile() && /\.(js|jsx)$/.test(fileDirent.name)) {
const filePath = path.join(dirPath, fileDirent.name);
filesPath.push(filePath);
}
if (fileDirent.isDirectory()) {
make(path.join(dirPath, fileDirent.name));
}
});
}
make(dirPath);
return filesPath;
}
const filesPath = getFilesPathByDirPath(dirPath);
let importedAntCptNames = [];
filesPath.forEach((filePath) => {
const cptNames = getImportedAntCptNamesByFilePath(filePath);
importedAntCptNames = union(importedAntCptNames, cptNames);
});
importedAntCptNames = importedAntCptNames.map((item) => {
return `antd/lib/${kebabCase(item)}`;
});
return importedAntCptNames;
}
const importedAntCptNames = getImportedAntCptNamesByDirPath('./src/');
module.exports = function getWebpackConfig(webpackConfig) {
webpackConfig.entry = {
lib: [
'react',
'react-dom',
'@hot-loader/react-dom',
'react-router-dom',
'react-sortable-hoc',
'react-dnd',
'react-dnd-html5-backend',
'd3',
'jquery',
'lodash',
'moment',
'xlsx',
'highlight.js',
'react-highlight',
...importedAntCptNames,
],
};
return webpackConfig;
};