UNPKG

@lark-project/cli

Version:

飞书项目插件开发工具

261 lines (260 loc) 12.8 kB
"use strict"; 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;