async function bundleEditorView()

in packages/build-plugin-lowcode/src/index.js [716:925]


async function bundleEditorView(
  webPackConfig,
  options,
  pluginOptions,
  metaPathMap,
  platforms,
  execCompile,
) {
  const { registerTask, getAllTask, onGetWebpackConfig } = options;
  const { rootDir, pkg: package } = options.context;
  if (!PARSED_NPM_NAME) {
    PARSED_NPM_NAME = parseNpmName(package.name);
  }
  const {
    package: packageName = package.name,
    library = PARSED_NPM_NAME.uniqueName,
    umdUrls,
    renderUrls,
    editUrls,
    baseLibrary = 'react',
    components,
    groups = DEFAULT_GROUPS,
    categories = DEFAULT_CATEGORIES,
    staticResources = {},
    singleComponent = false,
    ignoreComponents = {},
    engineScope = '@ali',
    externals = {},
    setterMap = {},
    buildTarget = 'build',
    fullbackMeta = 'default',
    lowcodeDir = 'lowcode',
    entryPath,
    type = 'component',
    setterName,
    presetConfig = {},
    customPlugins = [],
  } = pluginOptions || {};
  const metaExportName = `${PARSED_NPM_NAME.uniqueName}Meta`;
  const advancedRenderUrls = {};
  platforms.forEach((platform) => {
    advancedRenderUrls[platform] = [
      `./render/${platform}/view.js`,
      `./render/${platform}/view.css`,
    ];
  });
  let _setterMap = '{';
  const setterImportStr = Object.keys(setterMap || {})
    .map((item) => {
      _setterMap += `\n  ${item},`;
      return `import ${item} from '${setterMap[item]}';`;
    })
    .join('\n');
  _setterMap += '\n}';
  const indexJsParams = {
    package: packageName,
    version: package.version,
    library,
    urls: JSON.stringify(
      renderUrls ||
        umdUrls || [
          `${buildTarget}/${lowcodeDir}/view.js`,
          `${buildTarget}/${lowcodeDir}/view.css`,
        ],
    ),
    editUrls: JSON.stringify(
      editUrls ||
        umdUrls || [
          `${buildTarget}/${lowcodeDir}/view.js`,
          `${buildTarget}/${lowcodeDir}/view.css`,
        ],
    ),
    advancedRenderUrls: JSON.stringify(advancedRenderUrls),
    metaUrl: `${buildTarget}/${lowcodeDir}/meta.js`,
    devMode: false,
    metaExportName,
    baseLibrary,
    groups: JSON.stringify(groups),
    categories: JSON.stringify(categories),
    ignoreComponents: JSON.stringify(ignoreComponents),
    extraAssets: 'false',
    builtinAssets: 'false',
    setterImportStr,
    setterMap: _setterMap,
    metaPathMap: JSON.stringify(metaPathMap),
    fullbackMeta,
    setterName: setterName || '',
    type,
    presetConfig: JSON.stringify(presetConfig),
    customPlugins: JSON.stringify(customPlugins),
  };
  const indexJs = generateEntry({
    template: 'index.jsx',
    filename: 'index.jsx',
    rootDir,
    params: indexJsParams,
  });
  const previewJs = generateEntry({
    template: 'preview.jsx',
    filename: 'preview.jsx',
    rootDir,
    params: {
      isRax: baseLibrary === 'rax',
    },
  });
  let componentViews;
  let componentViewsExportStr;
  let componentViewsImportStr;
  const lowcodeViewPath = path.resolve(rootDir, `${lowcodeDir}/view.tsx`);
  if (singleComponent && fse.existsSync(lowcodeViewPath)) {
    componentViewsImportStr = `import * as SingleComponentData from '${lowcodeViewPath}'`;
    componentViews = `{
      ...SingleComponentData
    }`;
    // default 不一定存在,export { default } 不安全可能会报错
    componentViewsExportStr = `\nconst entryDefault = componentInstances.default;\nexport { entryDefault as default };\nexport * from '${lowcodeViewPath}';`;
  } else {
    const _componentViews = getUsedComponentViews(rootDir, lowcodeDir, components) || [];
    componentViews = `{${_componentViews
      .map((component) => {
        return `${component}: ${component}`;
      })
      .join(',')}}`;
    componentViewsExportStr = _componentViews
      .map((component) => {
        return `const ${component} = getRealComponent(${component}Data, '${component}');\nexport { ${component} };`;
      })
      .join('\n');
    // default 不一定存在,export { default } 不安全可能会报错
    componentViewsExportStr += `\nconst entryDefault = componentInstances.default;\nexport { entryDefault as default }`;
    componentViewsImportStr = _componentViews
      .map((component) => {
        const componentNameFolder = camel2KebabComponentName(component);
        const viewJsPath = path.resolve(rootDir, `${lowcodeDir}/${componentNameFolder}/view`).replace(/\\/g, '\\\\');
        return `import * as ${component}Data from '${viewJsPath}';`;
      })
      .join('\n');
  }
  const scssEntry = getScssEntry(rootDir);
  const viewPath = generateEntry({
    template: 'view.js',
    filename: 'view.js',
    rootDir,
    params: {
      entryPath: getEntry(rootDir, entryPath),
      scssImport: scssEntry ? `import '${scssEntry}'` : '',
      componentViews,
      componentViewsExportStr,
      componentViewsImportStr,
      library,
      execCompile,
    },
  });
  console.log('in render view: ', execCompile);
  if (!execCompile || editUrls || umdUrls || getAllTask().includes('lowcode-editor-view'))
    return viewPath;
  registerTask('lowcode-editor-view', webPackConfig);
  onGetWebpackConfig('lowcode-editor-view', (config) => {
    debug('editor view build');
    config.plugin('HtmlWebpackPlugin').use(HtmlWebpackPlugin, [
      {
        inject: false,
        templateParameters: {
          ...STATIC_RESOURCES_MAP[engineScope],
          ...staticResources,
        },
        template: require.resolve('./public/index.html'),
        filename: 'index.html',
      },
    ]);
    config.plugin('designer').use(HtmlWebpackPlugin, [
      {
        inject: false,
        templateParameters: {
          ...STATIC_RESOURCES_MAP[engineScope],
          ...staticResources,
        },
        template: require.resolve('./public/designer.html'),
        filename: 'designer.html',
      },
    ]);
    config.plugin('preview').use(HtmlWebpackPlugin, [
      {
        inject: false,
        templateParameters: {
          previewCssUrl: './preview.css',
          isRax: baseLibrary === 'rax',
          ...STATIC_RESOURCES_MAP[engineScope],
        },
        template: require.resolve('./public/preview.html'),
        filename: 'preview.html',
      },
    ]);
    config.merge({
      entry: {
        view: viewPath,
        index: indexJs,
        preview: previewJs,
      },
    });
    config.output.library(library).libraryTarget('umd');
    config.output.path(path.resolve(rootDir, `${buildTarget}/${lowcodeDir}`));
    config.externals({ ...COMMON_EXTERNALS_MAP[engineScope], ...externals });
    if (baseLibrary === 'rax') {
      const scssRule = config.module.rule('scss');
      scssRule.use('rpx-loader').loader('rpx-loader').before('css-loader');
    }
  });
  return viewPath;
}