in modules/code-generator/src/plugins/project/framework/icejs3/plugins/buildConfig.ts [18:113]
function getContent(cfg?: BuildConfigPluginConfig, routesContent?: string) {
return `
import { join } from 'path';
import { defineConfig } from '@ice/app';
import _ from 'lodash';
import fusion from '@ice/plugin-fusion';
import locales from '@ice/plugin-moment-locales';
import type { Plugin } from '@ice/app/esm/types';
interface PluginOptions {
id: string;
}
const plugin: Plugin<PluginOptions> = (options) => ({
// name 可选,插件名称
name: 'plugin-name',
// setup 必选,用于定制工程构建配置
setup: ({ onGetConfig, modifyUserConfig }) => {
modifyUserConfig('codeSplitting', 'page');
onGetConfig((config) => {
config.entry = {
web: join(process.cwd(), '.ice/entry.client.tsx'),
};
config.cssFilename = '[name].css';
config.configureWebpack = config.configureWebpack || [];
config.configureWebpack?.push((webpackConfig) => {
if (webpackConfig.output) {
webpackConfig.output.filename = '[name].js';
webpackConfig.output.chunkFilename = '[name].js';
}
return webpackConfig;
});
config.swcOptions = _.merge(config.swcOptions, {
compilationConfig: {
jsc: {
transform: {
react: {
runtime: 'classic',
},
},
},
}
});
// 解决 webpack publicPath 问题
config.transforms = config.transforms || [];
config.transforms.push((source: string, id: string) => {
if (id.includes('.ice/entry.client.tsx')) {
let code = \`
if (!__webpack_public_path__?.startsWith('http') && document.currentScript) {
// @ts-ignore
__webpack_public_path__ = document.currentScript.src.replace(/^(.*\\\\/)[^/]+$/, '$1');
window.__ICE_ASSETS_MANIFEST__ = window.__ICE_ASSETS_MANIFEST__ || {};
window.__ICE_ASSETS_MANIFEST__.publicPath = __webpack_public_path__;
}
\`;
code += source;
return { code };
}
});
});
},
});
// The project config, see https://v3.ice.work/docs/guide/basic/config
const minify = process.env.NODE_ENV === 'production' ? 'swc' : false;
export default defineConfig(() => ({
ssr: false,
ssg: false,
minify,
${routesContent}
externals: {
react: 'React',
'react-dom': 'ReactDOM',
'react-dom/client': 'ReactDOM',
'@alifd/next': 'Next',
lodash: 'var window._',
'@alilc/lowcode-engine': 'var window.AliLowCodeEngine',
},
plugins: [
fusion(${cfg?.themePackage ? `{
importStyle: 'sass',
themePackage: '${getThemeInfo(cfg.themePackage).name}',
}` : `{
importStyle: 'sass',
}`}),
locales(),
plugin(),
]
}));
`;
}