@lark-project/cli
Version:
飞书项目插件开发工具
261 lines (260 loc) • 12.8 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getWebpackConfig = void 0;
const fs_extra_1 = __importDefault(require("fs-extra"));
const paths_1 = __importDefault(require("./paths"));
const terser_webpack_plugin_1 = __importDefault(require("terser-webpack-plugin"));
const css_minimizer_webpack_plugin_1 = __importDefault(require("css-minimizer-webpack-plugin"));
const react_refresh_webpack_plugin_1 = __importDefault(require("@pmmmwh/react-refresh-webpack-plugin"));
const mini_css_extract_plugin_1 = __importDefault(require("mini-css-extract-plugin"));
const constants_1 = require("../../constants");
const env_1 = require("../../utils/env");
const InsertConfigPlugin_1 = __importDefault(require("../plugin/InsertConfigPlugin"));
const HotUpdatePlugin_1 = __importDefault(require("../plugin/HotUpdatePlugin"));
const RemoveUseStrictPlugin_1 = __importDefault(require("../plugin/RemoveUseStrictPlugin"));
const constants_2 = require("./constants");
/** 样式文件正则 */
const cssRegex = /\.css$/;
const cssModuleRegex = /\.module\.css$/;
const sassRegex = /\.(scss|sass)$/;
const sassModuleRegex = /\.module\.(scss|sass)$/;
const lessRegex = /\.less$/;
const lessModuleRegex = /\.module\.less$/;
const presetEnvOptions = {
targets: {
browsers: ['firefox >= 52', 'chrome >= 67', 'safari >= 11', 'edge >= 25'],
},
shippedProposals: true,
};
const getWebpackConfig = (webpackEnv) => {
var _a;
const isEnvDevelopment = webpackEnv === 'development';
const isEnvProduction = webpackEnv === 'production';
/** 读取插件本地配置 */
const plugin_config = (_a = fs_extra_1.default.readJsonSync(paths_1.default.pluginConfigJson)) !== null && _a !== void 0 ? _a : {};
const extWebpackConfig = require('./buildConfig');
const { domain = '', pluginID = '', version } = plugin_config !== null && plugin_config !== void 0 ? plugin_config : {};
const { ignores = /node_modules/, assetsIgnores = ignores, stylesIgnores = ignores, externals = {}, } = extWebpackConfig !== null && extWebpackConfig !== void 0 ? extWebpackConfig : {};
const merged_externals = Object.assign(Object.assign({}, constants_2.BUILTIN_EXTERNALS), externals);
return {
mode: isEnvProduction ? 'production' : 'development',
devtool: false,
bail: isEnvProduction,
entry: ['react-hot-loader/patch', paths_1.default.pluginIndexJs],
target: 'browserslist',
output: {
library: {
type: 'commonjs', // sdk 历史读取逻辑限制
},
/**
* https://github.com/webpack/webpack/blob/v5.88.2/lib/config/normalization.js#L349
* https://github.com/webpack/webpack/blob/v5.88.2/lib/web/JsonpChunkLoadingRuntimeModule.js#L339C7-L339C7
*/
hotUpdateGlobal: constants_2.HOT_UPDATE_FUNC_NAME,
globalObject: 'window',
path: paths_1.default.pluginBuild,
filename: isEnvProduction ? 'js/index.js' : 'js/[contenthash].index.js',
publicPath: isEnvProduction ? '/' : `https://${env_1.env.host}:${constants_2.DEFAULT_CONFIG.PORT}/`,
},
resolve: {
extensions: ['.ts', '.tsx', '.mjs', '.mjsx', '.js', '.jsx'],
},
externals: merged_externals,
optimization: {
minimize: isEnvProduction,
minimizer: [
new terser_webpack_plugin_1.default({
parallel: true,
extractComments: false,
terserOptions: {
mangle: true,
compress: { unused: false },
output: {
ascii_only: true,
comments: 'some',
beautify: false,
},
},
}),
new css_minimizer_webpack_plugin_1.default(),
],
},
module: {
rules: [
{
oneOf: [
{
test: cssRegex,
exclude: stylesIgnores,
use: [
{
loader: isEnvProduction
? mini_css_extract_plugin_1.default.loader
: require.resolve('style-loader'),
},
require.resolve('css-loader'),
],
},
{
test: cssModuleRegex,
exclude: stylesIgnores,
use: [
{
loader: isEnvProduction
? mini_css_extract_plugin_1.default.loader
: require.resolve('style-loader'),
},
{
loader: require.resolve('css-loader'),
options: {
modules: true,
},
},
],
},
{
test: lessModuleRegex,
exclude: stylesIgnores,
use: [
{
loader: isEnvProduction
? mini_css_extract_plugin_1.default.loader
: require.resolve('style-loader'),
},
{
loader: require.resolve('css-loader'),
options: {
modules: {
localIdentName: 'module__[local]__[hash:base64]',
},
},
},
require.resolve('less-loader'),
],
},
{
test: lessRegex,
exclude: stylesIgnores,
use: [
{
loader: isEnvProduction
? mini_css_extract_plugin_1.default.loader
: require.resolve('style-loader'),
},
require.resolve('css-loader'),
require.resolve('less-loader'),
],
},
{
test: sassModuleRegex,
exclude: stylesIgnores,
use: [
{
loader: isEnvProduction
? mini_css_extract_plugin_1.default.loader
: require.resolve('style-loader'),
},
{
loader: require.resolve('css-loader'),
options: {
modules: {
localIdentName: 'module__[local]__[hash:base64]',
},
},
},
require.resolve('sass-loader'),
],
},
{
test: sassRegex,
exclude: stylesIgnores,
use: [
{
loader: isEnvProduction
? mini_css_extract_plugin_1.default.loader
: require.resolve('style-loader'),
},
require.resolve('css-loader'),
require.resolve('sass-loader'),
],
},
{
test: /\.(js|mjs|jsx|ts|tsx)$/,
exclude: ignores,
loader: require.resolve('babel-loader'),
options: {
babelrc: false,
configFile: false,
presets: [
[require.resolve('@babel/preset-env'), presetEnvOptions],
require.resolve('@babel/preset-react'),
require.resolve('@babel/preset-typescript'),
],
plugins: [
isEnvDevelopment && require.resolve('react-refresh/babel'), // fix: $RefreshReg$ is not defined https://github.com/pmmmwh/react-refresh-webpack-plugin/issues/176
isEnvDevelopment && require.resolve('react-hot-loader/babel'),
[
require.resolve('@babel/plugin-transform-modules-commonjs'),
{ strictMode: false },
], // 移除'use strict'
[require.resolve('@babel/plugin-proposal-decorators'), { legacy: true }],
].filter(Boolean),
},
},
{
test: [/\.bmp$/, /\.svg$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
exclude: assetsIgnores,
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: constants_1.IMAGE_INLINE_MAX_SIZE,
},
},
generator: {
publicPath: isEnvProduction
? `${domain}/bff/v2/app/file/download/${pluginID}-${version}-`
: `https://${env_1.env.host}:${constants_2.DEFAULT_CONFIG.PORT}/assets/`,
outputPath: 'assets/',
},
},
{
test: /\.svg$/,
exclude: assetsIgnores,
use: [
{
loader: require.resolve('@svgr/webpack'), // svgr将svg文件转成ReactComponent
options: {
prettier: false,
svgo: false,
svgoConfig: {
plugins: [{ removeViewBox: false }],
},
titleProp: true,
ref: true,
},
},
],
issuer: {
and: [/\.(ts|tsx|js|jsx|md|mdx)$/],
},
},
],
},
],
},
plugins: [
isEnvProduction &&
new mini_css_extract_plugin_1.default({
filename: 'css/index.css',
}),
isEnvDevelopment && new react_refresh_webpack_plugin_1.default(),
isEnvDevelopment && new HotUpdatePlugin_1.default(),
new InsertConfigPlugin_1.default(),
new RemoveUseStrictPlugin_1.default(),
].filter(Boolean),
};
};
exports.getWebpackConfig = getWebpackConfig;