From 986d7f8183ad3e67e3ff10dcfbb3697be31d3bf1 Mon Sep 17 00:00:00 2001 From: rhlin Date: Tue, 12 Mar 2024 11:13:10 -0700 Subject: [PATCH 01/42] =?UTF-8?q?build:=20external=20public=20cdn=20locali?= =?UTF-8?q?ze=20=E5=85=AC=E5=85=B1cdn=E4=BE=9D=E8=B5=96=E5=8C=85=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=9C=AC=E5=9C=B0=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/design-core/package.json | 1 + packages/design-core/scripts/copyExternal.js | 36 +++++++++ packages/design-core/vite.config.js | 85 +++++++++++++++----- 3 files changed, 101 insertions(+), 21 deletions(-) create mode 100644 packages/design-core/scripts/copyExternal.js diff --git a/packages/design-core/package.json b/packages/design-core/package.json index ed189ca3f0..2f8c2a35a4 100644 --- a/packages/design-core/package.json +++ b/packages/design-core/package.json @@ -121,6 +121,7 @@ "svg-sprite-loader": "^6.0.11", "vite": "^4.3.7", "vite-plugin-monaco-editor": "^1.0.10", + "vite-plugin-static-copy": "^0.16.0", "vite-plugin-svg-icons": "^2.0.1", "vue-eslint-parser": "^8.0.1" }, diff --git a/packages/design-core/scripts/copyExternal.js b/packages/design-core/scripts/copyExternal.js new file mode 100644 index 0000000000..f9db1147da --- /dev/null +++ b/packages/design-core/scripts/copyExternal.js @@ -0,0 +1,36 @@ +import { viteStaticCopy } from 'vite-plugin-static-copy' +export const useLocalImportMap = (flag, publicPath = '', dir = 'import-map-static') => { + if (!flag) { + return { + cdnPrefix: null, + versionPlaceholder: null, + copyImportMapFilePlugin: (_) => null + } + } + const cdnPrefix = publicPath + (!publicPath || publicPath.endsWith('/') ? '' : '/') + dir + const versionPlaceholder = 'workspace' + const copyImportMapFilePlugin = (imports) => { + const files = Object.entries(imports).map(([libKey, libPath]) => { + const srcPath = libPath + .replace(new RegExp('^' + cdnPrefix + '/' + '(.*?)' + '@' + versionPlaceholder), 'node_modules/$1') + .replace(/\/$/, '') + const distPath = libPath + .replace(new RegExp('^' + cdnPrefix + '/'), dir + '/') + .replace(/\/$/, '') + .replace(/\/([^/]*?)$/, '') + return [libKey, libPath, srcPath, distPath] + }) + const copyFiles = files.map(([_libKey, _libPath, srcPath, distPath]) => ({ + src: srcPath, + dest: distPath + })) + return viteStaticCopy({ + targets: copyFiles + }) + } + return { + cdnPrefix, // 替换VITE_CDN_DOMAIN + versionPlaceholder, //替换@version中的version + copyImportMapFilePlugin + } +} diff --git a/packages/design-core/vite.config.js b/packages/design-core/vite.config.js index 4aea414aab..614c826a57 100644 --- a/packages/design-core/vite.config.js +++ b/packages/design-core/vite.config.js @@ -11,6 +11,7 @@ import esbuildCopy from 'esbuild-plugin-copy' import lowcodeConfig from './config/lowcode.config' import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' import { importmapPlugin } from './scripts/externalDeps' +import { useLocalImportMap } from './scripts/copyExternal' import visualizer from 'rollup-plugin-visualizer' const origin = 'http://localhost:9090/' @@ -198,13 +199,24 @@ const prodAlias = { const commonAlias = { '@opentiny/tiny-engine-app-addons': path.resolve(__dirname, './config/addons.js') } - +const isLocalImportMap = true // true公共依赖库使用本地打包文件,false公共依赖库使用公共CDN export default defineConfig(({ command, mode }) => { - const { VITE_CDN_DOMAIN } = loadEnv(mode, process.cwd(), '') + const { VITE_CDN_DOMAIN: envCdn, BASE_URL } = loadEnv(mode, process.cwd(), '') + const { + cdnPrefix: localCdn, + versionPlaceholder, + copyImportMapFilePlugin + } = useLocalImportMap(isLocalImportMap && (mode === 'alpha') | (mode === 'prod'), BASE_URL) + const VITE_CDN_DOMAIN = localCdn ?? envCdn + const monacoLocalPublicPath = `${localCdn}/monaco-assets/` const monacoPublicPath = { local: 'editor/monaco-workers', - alpha: 'https://tinyengine-assets.obs.cn-north-4.myhuaweicloud.com/files/monaco-assets', - prod: 'https://tinyengine-assets.obs.cn-north-4.myhuaweicloud.com/files/monaco-assets' + alpha: isLocalImportMap + ? monacoLocalPublicPath + : 'https://tinyengine-assets.obs.cn-north-4.myhuaweicloud.com/files/monaco-assets', + prod: isLocalImportMap + ? monacoLocalPublicPath + : 'https://tinyengine-assets.obs.cn-north-4.myhuaweicloud.com/files/monaco-assets' } let monacoEditorPluginInstance = monacoEditorPlugin({ publicPath: monacoPublicPath.local }) @@ -264,29 +276,60 @@ export default defineConfig(({ command, mode }) => { const importmap = { imports: { - prettier: `${VITE_CDN_DOMAIN}/prettier@${importMapVersions.prettier}/esm/standalone.mjs`, - 'prettier/': `${VITE_CDN_DOMAIN}/prettier@${importMapVersions.prettier}/esm/`, - 'prettier/parser-typescript': `${VITE_CDN_DOMAIN}/prettier@${importMapVersions.prettier}/esm/parser-typescript.mjs`, - 'prettier/parser-html': `${VITE_CDN_DOMAIN}/prettier@${importMapVersions.prettier}/esm/parser-html.mjs`, - 'prettier/parser-postcss': `${VITE_CDN_DOMAIN}/prettier@${importMapVersions.prettier}/esm/parser-postcss.mjs`, - 'prettier/parser-babel': `${VITE_CDN_DOMAIN}/prettier@${importMapVersions.prettier}/esm/parser-babel.mjs`, + prettier: `${VITE_CDN_DOMAIN}/prettier@${versionPlaceholder ?? importMapVersions.prettier}/esm/standalone.mjs`, + 'prettier/': `${VITE_CDN_DOMAIN}/prettier@${versionPlaceholder ?? importMapVersions.prettier}/esm/`, + 'prettier/parser-typescript': `${VITE_CDN_DOMAIN}/prettier@${ + versionPlaceholder ?? importMapVersions.prettier + }/esm/parser-typescript.mjs`, + 'prettier/parser-html': `${VITE_CDN_DOMAIN}/prettier@${ + versionPlaceholder ?? importMapVersions.prettier + }/esm/parser-html.mjs`, + 'prettier/parser-postcss': `${VITE_CDN_DOMAIN}/prettier@${ + versionPlaceholder ?? importMapVersions.prettier + }/esm/parser-postcss.mjs`, + 'prettier/parser-babel': `${VITE_CDN_DOMAIN}/prettier@${ + versionPlaceholder ?? importMapVersions.prettier + }/esm/parser-babel.mjs`, - vue: `${VITE_CDN_DOMAIN}/vue@${importMapVersions.vue}/dist/vue.runtime.esm-browser${ + vue: `${VITE_CDN_DOMAIN}/vue@${versionPlaceholder ?? importMapVersions.vue}/dist/vue.runtime.esm-browser${ command === 'build' ? '.prod' : '' }.js`, - '@opentiny/vue': `${VITE_CDN_DOMAIN}/@opentiny/vue@${importMapVersions.tinyVue}/runtime/tiny-vue.mjs`, - '@opentiny/vue-icon': `${VITE_CDN_DOMAIN}/@opentiny/vue@${importMapVersions.tinyVue}/runtime/tiny-vue-icon.mjs`, - '@opentiny/vue-common': `${VITE_CDN_DOMAIN}/@opentiny/vue@${importMapVersions.tinyVue}/runtime/tiny-vue-common.mjs`, - '@opentiny/vue-locale': `${VITE_CDN_DOMAIN}/@opentiny/vue@${importMapVersions.tinyVue}/runtime/tiny-vue-locale.mjs`, - '@opentiny/vue-design-smb': `${VITE_CDN_DOMAIN}/@opentiny/vue-design-smb@${importMapVersions.tinyVue}/index.js`, - '@opentiny/vue-theme/theme-tool': `${VITE_CDN_DOMAIN}/@opentiny/vue-theme@${importMapVersions.tinyVue}/theme-tool`, - '@opentiny/vue-theme/theme': `${VITE_CDN_DOMAIN}/@opentiny/vue-theme@${importMapVersions.tinyVue}/theme` + '@opentiny/vue': `${VITE_CDN_DOMAIN}/@opentiny/vue@${ + versionPlaceholder ?? importMapVersions.tinyVue + }/runtime/tiny-vue.mjs`, + '@opentiny/vue-icon': `${VITE_CDN_DOMAIN}/@opentiny/vue@${ + versionPlaceholder ?? importMapVersions.tinyVue + }/runtime/tiny-vue-icon.mjs`, + '@opentiny/vue-common': `${VITE_CDN_DOMAIN}/@opentiny/vue@${ + versionPlaceholder ?? importMapVersions.tinyVue + }/runtime/tiny-vue-common.mjs`, + '@opentiny/vue-locale': `${VITE_CDN_DOMAIN}/@opentiny/vue@${ + versionPlaceholder ?? importMapVersions.tinyVue + }/runtime/tiny-vue-locale.mjs`, + '@opentiny/vue-design-smb': `${VITE_CDN_DOMAIN}/@opentiny/vue-design-smb@${ + versionPlaceholder ?? importMapVersions.tinyVue + }/index.js`, + '@opentiny/vue-theme/theme-tool': `${VITE_CDN_DOMAIN}/@opentiny/vue-theme@${ + versionPlaceholder ?? importMapVersions.tinyVue + }/theme-tool`, + '@opentiny/vue-theme/theme': `${VITE_CDN_DOMAIN}/@opentiny/vue-theme@${ + versionPlaceholder ?? importMapVersions.tinyVue + }/theme` } } - const importMapStyles = [`${VITE_CDN_DOMAIN}/@opentiny/vue-theme@${importMapVersions.tinyVue}/index.css`] - - config.plugins.push(monacoEditorPluginInstance, htmlPlugin(mode), importmapPlugin(importmap, importMapStyles)) + const importMapStyles = [ + `${VITE_CDN_DOMAIN}/@opentiny/vue-theme@${versionPlaceholder ?? importMapVersions.tinyVue}/index.css` + ] + config.plugins.push( + monacoEditorPluginInstance, + htmlPlugin(mode), + importmapPlugin(importmap, importMapStyles), + copyImportMapFilePlugin({ + ...importmap.imports, // js import map + '@opentiny/vue-theme/index.css': importMapStyles[0] // css import style + }) + ) return config }) From 7659116b930008e01b7fdfd6aba950f5e4d9c3a0 Mon Sep 17 00:00:00 2001 From: rhlin Date: Tue, 12 Mar 2024 12:01:28 -0700 Subject: [PATCH 02/42] =?UTF-8?q?build:=20cdn=E5=A4=96=E9=83=A8=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E8=A7=A3=E8=80=A6=EF=BC=8C=E4=BF=AE=E5=A4=8DbaseUrl?= =?UTF-8?q?=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/design-core/vite.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/design-core/vite.config.js b/packages/design-core/vite.config.js index 614c826a57..6aaadf6792 100644 --- a/packages/design-core/vite.config.js +++ b/packages/design-core/vite.config.js @@ -201,12 +201,12 @@ const commonAlias = { } const isLocalImportMap = true // true公共依赖库使用本地打包文件,false公共依赖库使用公共CDN export default defineConfig(({ command, mode }) => { - const { VITE_CDN_DOMAIN: envCdn, BASE_URL } = loadEnv(mode, process.cwd(), '') + const { VITE_CDN_DOMAIN: envCdn } = loadEnv(mode, process.cwd(), '') const { cdnPrefix: localCdn, versionPlaceholder, copyImportMapFilePlugin - } = useLocalImportMap(isLocalImportMap && (mode === 'alpha') | (mode === 'prod'), BASE_URL) + } = useLocalImportMap(isLocalImportMap && (mode === 'alpha') | (mode === 'prod'), process.env.BASE_URL) const VITE_CDN_DOMAIN = localCdn ?? envCdn const monacoLocalPublicPath = `${localCdn}/monaco-assets/` const monacoPublicPath = { From d3d682439433918c4ca88457370ce4a9ae16a541 Mon Sep 17 00:00:00 2001 From: rhlin Date: Tue, 12 Mar 2024 12:44:57 -0700 Subject: [PATCH 03/42] =?UTF-8?q?build:=20cdn=E4=BE=9D=E8=B5=96=E8=A7=A3?= =?UTF-8?q?=E8=80=A6=20=E4=BF=AE=E6=AD=A3baseUrl=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/design-core/scripts/copyExternal.js | 5 +++++ packages/design-core/vite.config.js | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/design-core/scripts/copyExternal.js b/packages/design-core/scripts/copyExternal.js index f9db1147da..8aede7f97d 100644 --- a/packages/design-core/scripts/copyExternal.js +++ b/packages/design-core/scripts/copyExternal.js @@ -34,3 +34,8 @@ export const useLocalImportMap = (flag, publicPath = '', dir = 'import-map-stati copyImportMapFilePlugin } } + +export const getBaseUrlFromCli = (fallback = '') => { + const index = process.argv?.indexOf('--base') + return index > -1 ? process.argv[index + 1] || fallback : fallback +} diff --git a/packages/design-core/vite.config.js b/packages/design-core/vite.config.js index 6aaadf6792..2570c6a337 100644 --- a/packages/design-core/vite.config.js +++ b/packages/design-core/vite.config.js @@ -11,7 +11,7 @@ import esbuildCopy from 'esbuild-plugin-copy' import lowcodeConfig from './config/lowcode.config' import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' import { importmapPlugin } from './scripts/externalDeps' -import { useLocalImportMap } from './scripts/copyExternal' +import { useLocalImportMap, getBaseUrlFromCli } from './scripts/copyExternal' import visualizer from 'rollup-plugin-visualizer' const origin = 'http://localhost:9090/' @@ -206,9 +206,9 @@ export default defineConfig(({ command, mode }) => { cdnPrefix: localCdn, versionPlaceholder, copyImportMapFilePlugin - } = useLocalImportMap(isLocalImportMap && (mode === 'alpha') | (mode === 'prod'), process.env.BASE_URL) + } = useLocalImportMap(isLocalImportMap && (mode === 'alpha') | (mode === 'prod'), getBaseUrlFromCli(config.base)) const VITE_CDN_DOMAIN = localCdn ?? envCdn - const monacoLocalPublicPath = `${localCdn}/monaco-assets/` + const monacoLocalPublicPath = `${localCdn}/monaco-assets` const monacoPublicPath = { local: 'editor/monaco-workers', alpha: isLocalImportMap From 7973917cac03aa2d8e90d8cdf0536c3c5f084c18 Mon Sep 17 00:00:00 2001 From: rhlin Date: Tue, 12 Mar 2024 15:26:09 -0700 Subject: [PATCH 04/42] =?UTF-8?q?build:=20cdn=E4=BE=9D=E8=B5=96=E4=B8=89?= =?UTF-8?q?=E6=96=B9=E8=A7=A3=E8=80=A6=EF=BC=8C=E4=BC=98=E5=8C=96=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E5=9E=8B=E6=8B=B7=E8=B4=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/design-core/scripts/copyExternal.js | 33 ++++++++++++++++---- packages/design-core/vite.config.js | 19 +++++++---- 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/packages/design-core/scripts/copyExternal.js b/packages/design-core/scripts/copyExternal.js index 8aede7f97d..f0bedf6b5c 100644 --- a/packages/design-core/scripts/copyExternal.js +++ b/packages/design-core/scripts/copyExternal.js @@ -9,8 +9,20 @@ export const useLocalImportMap = (flag, publicPath = '', dir = 'import-map-stati } const cdnPrefix = publicPath + (!publicPath || publicPath.endsWith('/') ? '' : '/') + dir const versionPlaceholder = 'workspace' - const copyImportMapFilePlugin = (imports) => { + const copyImportMapFilePlugin = (imports, packageCopy) => { const files = Object.entries(imports).map(([libKey, libPath]) => { + if (packageCopy.includes(libKey)) { + const srcPath = libPath + .replace(new RegExp('^' + cdnPrefix + '/' + '(.*?)' + '@' + versionPlaceholder + '.*?$'), 'node_modules/$1') + .replace(/\/$/, '') + const distFullPath = libPath + .replace(new RegExp('^' + cdnPrefix + '/' + '(.*?' + '@' + versionPlaceholder + ')' + '.*?$'), dir + '/$1') + .replace(/\/$/, '') + const distPath = distFullPath.replace(/\/([^/]*?)$/, '') + const rename = distFullPath.match(/\/([^/]*?)$/)?.[1] + + return [libKey, libPath, srcPath, distPath, rename] + } const srcPath = libPath .replace(new RegExp('^' + cdnPrefix + '/' + '(.*?)' + '@' + versionPlaceholder), 'node_modules/$1') .replace(/\/$/, '') @@ -18,12 +30,21 @@ export const useLocalImportMap = (flag, publicPath = '', dir = 'import-map-stati .replace(new RegExp('^' + cdnPrefix + '/'), dir + '/') .replace(/\/$/, '') .replace(/\/([^/]*?)$/, '') - return [libKey, libPath, srcPath, distPath] + return [libKey, libPath, srcPath, distPath, null] }) - const copyFiles = files.map(([_libKey, _libPath, srcPath, distPath]) => ({ - src: srcPath, - dest: distPath - })) + const copyFiles = files + .map(([_libKey, _libPath, srcPath, distPath, rename]) => ({ + src: srcPath, + dest: distPath, + rename: rename + })) + .reduce((acc, cur) => { + //去重 + if (!acc.some((item) => item.src === cur.src && item.dest === cur.dest)) { + acc.push(cur) + } + return acc + }, []) return viteStaticCopy({ targets: copyFiles }) diff --git a/packages/design-core/vite.config.js b/packages/design-core/vite.config.js index 2570c6a337..38566ba960 100644 --- a/packages/design-core/vite.config.js +++ b/packages/design-core/vite.config.js @@ -311,10 +311,10 @@ export default defineConfig(({ command, mode }) => { }/index.js`, '@opentiny/vue-theme/theme-tool': `${VITE_CDN_DOMAIN}/@opentiny/vue-theme@${ versionPlaceholder ?? importMapVersions.tinyVue - }/theme-tool`, + }/theme-tool.js`, '@opentiny/vue-theme/theme': `${VITE_CDN_DOMAIN}/@opentiny/vue-theme@${ versionPlaceholder ?? importMapVersions.tinyVue - }/theme` + }/theme/index.js` } } @@ -326,10 +326,17 @@ export default defineConfig(({ command, mode }) => { monacoEditorPluginInstance, htmlPlugin(mode), importmapPlugin(importmap, importMapStyles), - copyImportMapFilePlugin({ - ...importmap.imports, // js import map - '@opentiny/vue-theme/index.css': importMapStyles[0] // css import style - }) + copyImportMapFilePlugin( + { + ...importmap.imports, // js import map + '@opentiny/vue-theme/index.css': importMapStyles[0] // css import style + }, + [ + // 这两个包的js存在相对路径引用,不能单独拷贝一个文件,需要整个包拷贝 + '@opentiny/vue-theme/theme-tool', + '@opentiny/vue-theme/theme' + ] + ) ) return config }) From 2d3c5745781928534a1827cb21d946afe496e611 Mon Sep 17 00:00:00 2001 From: rhlin Date: Wed, 13 Mar 2024 16:31:06 -0700 Subject: [PATCH 05/42] =?UTF-8?q?build:=20cdn=E4=BE=9D=E8=B5=96=E8=A7=A3?= =?UTF-8?q?=E8=80=A6=EF=BC=8C=E8=A7=A3=E5=86=B3=E7=9B=AE=E5=BD=95=E5=A4=8D?= =?UTF-8?q?=E5=88=B6=E6=96=87=E4=BB=B6=E7=9A=84=E7=9B=B8=E5=AF=B9=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/design-core/package.json | 1 + packages/design-core/scripts/copyExternal.js | 43 +++++- .../design-core/scripts/replaceImportPath.mjs | 129 ++++++++++++++++++ 3 files changed, 170 insertions(+), 3 deletions(-) create mode 100644 packages/design-core/scripts/replaceImportPath.mjs diff --git a/packages/design-core/package.json b/packages/design-core/package.json index 2f8c2a35a4..cc14c5e750 100644 --- a/packages/design-core/package.json +++ b/packages/design-core/package.json @@ -109,6 +109,7 @@ "eslint": "^8.38.0", "eslint-plugin-vue": "^8.0.0", "fs-extra": "^10.1.0", + "glob": "^10.3.4", "husky": "^8.0.0", "lerna": "^7.2.0", "less": "^4.1.2", diff --git a/packages/design-core/scripts/copyExternal.js b/packages/design-core/scripts/copyExternal.js index f0bedf6b5c..e0fafaf7e9 100644 --- a/packages/design-core/scripts/copyExternal.js +++ b/packages/design-core/scripts/copyExternal.js @@ -1,4 +1,36 @@ import { viteStaticCopy } from 'vite-plugin-static-copy' +import { replaceImportPath } from './replaceImportPath.mjs' + +export const handleStaticFileRelativeImport = (dirs, option = { detail: false }) => { + let config + return { + name: 'vite-plugin-replace-import:build', + apply: 'build', + configResolved(resolvedConfig) { + config = resolvedConfig + }, + async closeBundle() { + const logger = config.logger + const outputDir = config.build.outDir + const processDirs = dirs.map((dir) => `${outputDir}/${dir}`) + replaceImportPath(processDirs, logger).then(({ fileList, success, error, errorFileList }) => { + logger.info( + `[vite-plugin-replace-import]: relative path replaced with certain file path total ${success.length} path(s) in ${fileList.length} file(s)` + ) + if (success.length) { + option.detail && logger.info(success) + } + if (error?.length) { + logger.info( + `[vite-plugin-replace-import]: error found in total ${error.length} path(s) in ${errorFileList.length} file(s)` + ) + option.detail && logger.info(error) + } + }) + } + } +} + export const useLocalImportMap = (flag, publicPath = '', dir = 'import-map-static') => { if (!flag) { return { @@ -45,9 +77,14 @@ export const useLocalImportMap = (flag, publicPath = '', dir = 'import-map-stati } return acc }, []) - return viteStaticCopy({ - targets: copyFiles - }) + + const handleImport = copyFiles.filter(({ rename }) => !!rename).map(({ dest, rename }) => `${dest}/${rename}`) + return [ + ...viteStaticCopy({ + targets: copyFiles + }), + handleStaticFileRelativeImport(handleImport) + ] } return { cdnPrefix, // 替换VITE_CDN_DOMAIN diff --git a/packages/design-core/scripts/replaceImportPath.mjs b/packages/design-core/scripts/replaceImportPath.mjs new file mode 100644 index 0000000000..3ec3fabb91 --- /dev/null +++ b/packages/design-core/scripts/replaceImportPath.mjs @@ -0,0 +1,129 @@ +import fs from 'node:fs' +import fsPromise from 'node:fs/promises' +import path from 'node:path' +import { glob } from 'glob' +import { parse } from '@babel/core' +import traversePkg from '@babel/traverse' +import generatePkg from '@babel/generator' +const traverse = traversePkg.default +const generate = generatePkg.default + +const flattenReducer = (acc, cur) => [...acc, ...cur] + +export function relativePathPattern(relativePath) { + return './' + (path.sep === '/' ? relativePath : relativePath.replace(/\\/g, '/')) +} + + +export function resolvePath(importPath, currentFilePath) { + if (['js', 'mjs'].some(suffix =>importPath.endsWith(suffix))) { // 文件名已经带有.js,.mjs后缀 + return importPath + } + const parentPath = path.resolve(currentFilePath, '../') + const filePrefix = path.resolve(parentPath, importPath) + + if (fs.existsSync(filePrefix)) { + const stat = fs.statSync(filePrefix) + if (stat.isDirectory()) { + let mainFileName = 'index.js' + + const packageFile = path.resolve(filePrefix, 'package.json') + + if (fs.existsSync(packageFile)) { + const packageFileContent = fs.readFileSync(packageFile, { encoding: 'utf-8' }) + const packageJson = JSON.parse(packageFileContent) + mainFileName = packageJson.module || packageJson.main || mainFileName + } + + const mainFile = path.resolve(filePrefix, mainFileName) + if (fs.existsSync(mainFile)) { + return relativePathPattern(path.relative(parentPath, mainFile)) + } + return null + } + return importPath + } + const possibleSuffix = ['.js', '.mjs'] + const suffix = possibleSuffix.find(suf => fs.existsSync(filePrefix + suf)) + if (suffix) { + return relativePathPattern(path.relative(path.resolve(currentFilePath, '../'), filePrefix + suffix)) + } + return null +} + +export function babelReplaceImportPathWithCertainFIleName(content, currentFilePath, logger) { + let fileChangedMark = false + let result = { + code: null, + success: [], + error: [] + } + const ast = parse(content, { sourceType: 'module' }) + traverse(ast, { + ImportOrExportDeclaration: (astPath) => { + const node = astPath.node + if (!node.source) { + return + } + const importPath = node.source.value + if(importPath.startsWith('.')) { + const certainPath = resolvePath(importPath, currentFilePath) + if(!certainPath) { + logger.warn(`File not found: ${importPath} used in ${currentFilePath}`) + result.error.push(importPath) + } + if(certainPath !== importPath) { + node.source.value = certainPath + fileChangedMark = true + result.success.push({before: importPath, after: certainPath}) + } + } + } + }) + if (fileChangedMark) { + const { code } = generate(ast, { + jsescOption: { + quotes: 'single' + } + }) + result.code = code + } + return result +} +/** + * 入口函数 replaceImportPath + * 1) 扫描dirs文件夹内的js文件 + * 2) 分析js文件内部的相对路径引用,替换成确定带完整文件名和后缀的相对文件路径 + * @param {Array} dirs 需要处理的目录的数组 + */ +export function replaceImportPath(dirs, logger = console) { + const files = dirs.map(dir => glob.sync(`${path.resolve(dir)}/**/*.js`)).reduce(flattenReducer, []) + return Promise.all(files.map(async file => { + const content = await fsPromise.readFile(file, {encoding: 'utf-8'}) + const { code, success, error} = babelReplaceImportPathWithCertainFIleName(content, file, logger) + if (code) { + await fsPromise.writeFile(file, code, { encoding: 'utf-8' }) + } + return { + file, + changed: !!code, + success, + error + } + })).then(arr => { + const success = arr.map(item => item.success.map(s => ({...s, file: item.file}))).reduce(flattenReducer, []) + const error = arr.map(item => item.error.map(e => ({notFound: e, file: item.file}))).reduce(flattenReducer, []) + const fileList = arr.filter(item => item.changed) + const errorFileList = arr.filter(item => item.error?.length) + return { + fileList, + success, + error, + errorFileList + } + }) +} + +// replaceImportPath(['dist/import-map-static-copy3/@opentiny/vue-theme@workspace']).then(fileList => { +// console.log(`${fileList.length} file(s) handled`) +// }) \ No newline at end of file From c8712a7cdfca7b7452bac1ff4f7096975c388775 Mon Sep 17 00:00:00 2001 From: rhlin Date: Thu, 14 Mar 2024 17:48:34 -0700 Subject: [PATCH 06/42] =?UTF-8?q?build(design-core):=20=E4=BF=AE=E5=A4=8Dm?= =?UTF-8?q?onaco=E7=9A=84worker=E4=BD=BF=E7=94=A8cdn=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E5=89=8D=E7=BC=80=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8B=E6=89=93?= =?UTF-8?q?=E5=8C=85=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/design-core/package.json | 2 +- packages/design-core/scripts/copyExternal.js | 2 ++ packages/design-core/vite.config.js | 20 +++++++++++++------- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/design-core/package.json b/packages/design-core/package.json index cc14c5e750..7f81e72db6 100644 --- a/packages/design-core/package.json +++ b/packages/design-core/package.json @@ -121,7 +121,7 @@ "rollup-plugin-visualizer": "^5.8.3", "svg-sprite-loader": "^6.0.11", "vite": "^4.3.7", - "vite-plugin-monaco-editor": "^1.0.10", + "vite-plugin-monaco-editor": "^1.1.0", "vite-plugin-static-copy": "^0.16.0", "vite-plugin-svg-icons": "^2.0.1", "vue-eslint-parser": "^8.0.1" diff --git a/packages/design-core/scripts/copyExternal.js b/packages/design-core/scripts/copyExternal.js index e0fafaf7e9..902f27628a 100644 --- a/packages/design-core/scripts/copyExternal.js +++ b/packages/design-core/scripts/copyExternal.js @@ -35,6 +35,7 @@ export const useLocalImportMap = (flag, publicPath = '', dir = 'import-map-stati if (!flag) { return { cdnPrefix: null, + distDir: null, versionPlaceholder: null, copyImportMapFilePlugin: (_) => null } @@ -88,6 +89,7 @@ export const useLocalImportMap = (flag, publicPath = '', dir = 'import-map-stati } return { cdnPrefix, // 替换VITE_CDN_DOMAIN + distDir: dir, versionPlaceholder, //替换@version中的version copyImportMapFilePlugin } diff --git a/packages/design-core/vite.config.js b/packages/design-core/vite.config.js index 38566ba960..c22d5456d2 100644 --- a/packages/design-core/vite.config.js +++ b/packages/design-core/vite.config.js @@ -204,19 +204,17 @@ export default defineConfig(({ command, mode }) => { const { VITE_CDN_DOMAIN: envCdn } = loadEnv(mode, process.cwd(), '') const { cdnPrefix: localCdn, + distDir: localDist, versionPlaceholder, copyImportMapFilePlugin } = useLocalImportMap(isLocalImportMap && (mode === 'alpha') | (mode === 'prod'), getBaseUrlFromCli(config.base)) const VITE_CDN_DOMAIN = localCdn ?? envCdn const monacoLocalPublicPath = `${localCdn}/monaco-assets` + const monacoDistPath = `${localDist}/monaco-assets` const monacoPublicPath = { local: 'editor/monaco-workers', - alpha: isLocalImportMap - ? monacoLocalPublicPath - : 'https://tinyengine-assets.obs.cn-north-4.myhuaweicloud.com/files/monaco-assets', - prod: isLocalImportMap - ? monacoLocalPublicPath - : 'https://tinyengine-assets.obs.cn-north-4.myhuaweicloud.com/files/monaco-assets' + alpha: 'https://tinyengine-assets.obs.cn-north-4.myhuaweicloud.com/files/monaco-assets', + prod: 'https://tinyengine-assets.obs.cn-north-4.myhuaweicloud.com/files/monaco-assets' } let monacoEditorPluginInstance = monacoEditorPlugin({ publicPath: monacoPublicPath.local }) @@ -266,7 +264,15 @@ export default defineConfig(({ command, mode }) => { // command === 'build' config.resolve.alias = { ...commonAlias, ...prodAlias } - monacoEditorPluginInstance = monacoEditorPlugin({ publicPath: monacoPublicPath[mode] }) + monacoEditorPluginInstance = monacoEditorPlugin( + isLocalImportMap + ? { + publicPath: monacoLocalPublicPath, + forceBuildCDN: true, + customDistPath: (_root, outDir, _base) => path.join(outDir, monacoDistPath) + } + : { publicPath: monacoPublicPath[mode] } + ) if (mode === 'prod') { config.build.minify = true From 4e1cc0b9fac63c32a18c87fb4cab04436962f55e Mon Sep 17 00:00:00 2001 From: rhlin Date: Fri, 15 Mar 2024 16:37:21 -0700 Subject: [PATCH 07/42] =?UTF-8?q?build:=20=E6=9C=AC=E5=9C=B0=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E4=B9=9F=E6=94=AF=E6=8C=81=E8=84=B1=E7=A6=BBcdn?= =?UTF-8?q?=E4=B8=89=E6=96=B9=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/design-core/canvas.html | 1 - packages/design-core/scripts/copyExternal.js | 69 +++++++------------- packages/design-core/vite.config.js | 4 +- 3 files changed, 26 insertions(+), 48 deletions(-) diff --git a/packages/design-core/canvas.html b/packages/design-core/canvas.html index fedb11101a..b0095770e1 100644 --- a/packages/design-core/canvas.html +++ b/packages/design-core/canvas.html @@ -4,7 +4,6 @@ -