Skip to content

Commit b5ed1d4

Browse files
committed
fix: making some variables more semantic.
1 parent 9fb12c8 commit b5ed1d4

7 files changed

Lines changed: 69 additions & 38 deletions

File tree

designer-demo/tests/localCdnCustomConfig.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ describe('localCDN 自定义配置测试', () => {
7272
const updatedViteConfig = originalViteConfig.replace(
7373
'const baseConfig = useTinyEngineBaseConfig({',
7474
`const baseConfig = useTinyEngineBaseConfig({
75-
localCdnConfig: {
75+
importMapLocalConfig: {
7676
importMap: {
7777
imports: {
7878
'vue': "\${VITE_CDN_DOMAIN}/vue\${versionDelimiter}3.4.21\${fileDelimiter}/dist/vue.runtime.esm-browser.prod.js"

docs/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
- [区块局域网发布方案(Node.js服务端)](./solutions/block-lan-release-solution.md)
4747
- [设计器中引入第三方组件库](./solutions/third-party-library-in-designer.md)
4848
- [物料同步方案](./solutions/material-sync-solution.md)
49-
- [本地化CDN方案](./solutions/local-cdn.md)
49+
- [本地化CDN方案](./solutions/import-map-local.md)
5050
- 扩展能力介绍
5151
- [新架构介绍](./extension-capabilities-overview/new-architecture.md)
5252
- [注册表](./extension-capabilities-overview/registry.md)
Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
1-
# 本地化CDN方案
1+
# 本地化 import-map CDN方案
22

33
## 概述
44

5-
本地化CDN是一种在生产环境中将远程CDN资源替换为本地文件的解决方案。它具有以下优势:
5+
TinyEngine 在画布和预览都使用了 import-map 的方案来依赖 vue、vue-i18n 以及物料等依赖,这些 import-map 默认会使用 npmmirror 的 CDN。
6+
但是,在一些企业化的场景中,我们无法依赖这种外部的 CDN。(可用性和稳定性要求。)
7+
8+
当前可以采取的方案有:
9+
- 搭建私网的 unpkg
10+
- 使用本文档介绍的 import-map CDN 本地化方案
11+
12+
本地化 import-map CDN是一种在构建时,将 import-map 所需的远程CDN资源替换为构建产物中的文件的解决方案。它具有以下优势:
613

714
1. 减少对外部CDN的依赖,提高应用的可靠性
8-
2. 在离线环境或内网环境中使用CDN资源
9-
3. 加快资源加载速度,提升应用性能
15+
2. 在离线环境或内网环境中访问 import-map 所需的 CDN 资源。
16+
3. 加快资源加载速度,提升应用性能
1017

1118
## 使用方法
1219

13-
### 修改环境变量使用本地化CDN
20+
### 修改环境变量使用 import-map CDN 本地化方案
1421

15-
要启用本地化CDN功能,请按照以下步骤操作:
22+
要启用 import-map CDN 本地化功能,请按照以下步骤操作:
1623

1724
1. 修改环境变量
1825

@@ -39,7 +46,7 @@ VITE_LOCAL_CDN_PATH=./local-cdn-static
3946

4047
```javascript
4148
const baseConfig = useTinyEngineBaseConfig({
42-
localCdnConfig: {
49+
importMapLocalConfig: {
4350
importMap: { imports: { ... } },
4451
copy: { ... }
4552
}
@@ -53,13 +60,13 @@ CDN 本地化接受以下配置选项:
5360

5461
| 参数 | 类型 | 默认值 | 说明 |
5562
|------|------|--------|------|
56-
| localCdnConfig | Object | `{ importMap: { imports: {} }, copy: {} }` | 本地CDN配置对象 |
57-
| localCdnConfig.importMap | Object | `{ imports: {} }` | 导入映射配置,定义需要本地化的CDN依赖 |
58-
| localCdnConfig.copy | Object | `{}` | 自定义复制配置,可以覆盖特定包的默认配置 |
63+
| importMapLocalConfig | Object | `{ importMap: { imports: {} }, copy: {} }` | 本地CDN配置对象 |
64+
| importMapLocalConfig.importMap | Object | `{ imports: {} }` | 导入映射配置,定义需要本地化的CDN依赖 |
65+
| importMapLocalConfig.copy | Object | `{}` | 自定义复制配置,可以覆盖特定包的默认配置 |
5966

6067
#### importMap 详细说明
6168

62-
`localCdnConfig.importMap` 是一个包含 `imports` 属性的对象,它定义了需要本地化的CDN依赖。在插件内部,它会与默认的导入映射配置合并。
69+
`importMapLocalConfig.importMap` 是一个包含 `imports` 属性的对象,它定义了需要本地化的CDN依赖。在插件内部,它会与默认的导入映射配置合并。
6370

6471
import-map.json 的格式示例:
6572
```json
@@ -79,14 +86,14 @@ URL格式说明:
7986

8087
插件将解析这些URL,提取包名、版本和文件路径,然后在构建时将它们替换为本地路径。
8188

82-
**重要说明**:如果您在 Vite 配置中传递了 `localCdnConfig.importMap`,还需要在 registry 注册表的 config 中传入同样的配置,以确保应用在运行时能正确读取自定义的 importMap 配置。例如:
89+
**重要说明**:如果您在 Vite 配置中传递了 `importMapLocalConfig.importMap`,还需要在 registry 注册表的 config 中传入同样的配置,以确保应用在运行时能正确读取自定义的 importMap 配置。例如:
8390

8491
```javascript
8592
// 在注册表配置中
8693
{
8794
config: {
8895
id: 'engine.config',
89-
importMap: localCdnConfig.importMap,
96+
importMap: importMapLocalConfig.importMap,
9097
// ... 其他配置
9198
}
9299
}
@@ -96,7 +103,7 @@ URL格式说明:
96103

97104
#### copy 详细说明
98105

99-
`localCdnConfig.copy` 是一个可选的配置对象,用于覆盖特定包的默认复制配置。它的结构是一个对象,键是包名,值是该包的复制配置。
106+
`importMapLocalConfig.copy` 是一个可选的配置对象,用于覆盖特定包的默认复制配置。它的结构是一个对象,键是包名,值是该包的复制配置。
100107

101108
默认配置如下:
102109
```javascript
@@ -179,7 +186,7 @@ VITE_CDN_DOMAIN=https://unpkg.com
179186

180187
### 1. 分析导入映射并收集依赖
181188

182-
`localCdnPlugin`会分析提供的`localCdnConfig`和默认的导入映射,识别所有需要本地化的CDN依赖。这个过程包括:
189+
`importMapLocalPlugin`会分析提供的`importMapLocalConfig`和默认的导入映射,识别所有需要本地化的CDN依赖。这个过程包括:
183190

184191
- 解析CDN URL获取包名、版本和文件路径
185192
- 合并用户配置和默认配置

packages/build/vite-config/src/default-config.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import esbuildCopy from 'esbuild-plugin-copy'
1010
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
1111
import visualizerCjs from 'rollup-plugin-visualizer'
1212
import generateComment from '@opentiny/tiny-engine-vite-plugin-meta-comments'
13-
import { getBaseUrlFromCli, copyBundleDeps, localCdnPlugin } from './localCdnFile/index.js'
13+
import { getBaseUrlFromCli, copyBundleDeps, importMapLocalPlugin } from './localCdnFile/index.js'
1414
import { devAliasPlugin } from './vite-plugins/devAliasPlugin.js'
1515
import { htmlUpgradeHttpsPlugin } from './vite-plugins/upgradeHttpsPlugin.js'
1616
import { canvasDevExternal } from './canvas-dev-external.js'
@@ -173,14 +173,14 @@ export function useTinyEngineBaseConfig(engineConfig) {
173173
const logger = console
174174
logger.log('[local-cdn-plugin]: Initializing local CDN plugin')
175175

176-
const cdnPlugins = localCdnPlugin({
177-
localCdnConfig: engineConfig.localCdnConfig,
176+
const importMapPlugins = importMapLocalPlugin({
177+
importMapLocalConfig: engineConfig.importMapLocalConfig,
178178
base: getBaseUrlFromCli(config.base),
179179
cdnDir: VITE_LOCAL_BUNDLE_PATH
180180
})
181181

182-
if (cdnPlugins && cdnPlugins.length > 0) {
183-
config.plugins.push(...cdnPlugins)
182+
if (importMapPlugins && importMapPlugins.length > 0) {
183+
config.plugins.push(...importMapPlugins)
184184
}
185185
}
186186

packages/build/vite-config/src/localCdnFile/localCdnPlugin.js renamed to packages/build/vite-config/src/localCdnFile/importMapLocalPlugin.js

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,15 @@ const defaultCopyConfig = {
2525

2626
/**
2727
* 从importMapUrl字符串中提取包名、版本和文件路径
28+
* ${versionDelimiter} 和 ${fileDelimiter} 是默认的 importMapUrl 中的占位符,
29+
* 例如:
30+
* importMapUrl = '${VITE_CDN_DOMAIN}/${packageName}${versionDelimiter}${version}${fileDelimiter}${filePath}'
31+
* 提取的信息对象:
32+
* {
33+
* packageName: '${packageName}',
34+
* version: '${version}',
35+
* filePathInPackage: '${filePath}'
36+
* }
2837
* @param {string} str - 导入字符串
2938
* @returns {Object} - 提取的信息对象
3039
* @returns {string} packageName - 包名
@@ -43,7 +52,7 @@ function extractInfo(str) {
4352
filePathInPackage: filePath || '/'
4453
}
4554
} catch (error) {
46-
logger.error(`[local-cdn-plugin]: Failed to extract info from ${str} 提取 importMap 信息失败`, error)
55+
logger.error(`[import-map-local-plugin]: Failed to extract info from ${str} 提取 importMap 信息失败`, error)
4756
}
4857
}
4958

@@ -130,22 +139,41 @@ function getCdnPathNpmInfo(
130139
/**
131140
* 本地化CDN插件
132141
* @param {Object} options - 配置选项
133-
* @param {Object} options.localCdnConfig - 本地CDN配置
134-
* @param {Object} options.localCdnConfig.importMap - 导入映射配置,定义需要本地化的CDN依赖
135-
* @param {Object} options.localCdnConfig.copy - 自定义复制配置,可以覆盖特定包的默认配置
142+
* @param {Object} options.importMapLocalConfig - 本地CDN配置
143+
* @param {Object} options.importMapLocalConfig.importMap - 导入映射配置,定义需要本地化的CDN依赖
144+
* @param {Object} options.importMapLocalConfig.copy - 自定义复制配置,可以覆盖特定包的默认配置
136145
* @param {string} options.base - 构建的base URL
137146
* @param {string} options.cdnDir - 构建目录中的CDN文件夹名称
138147
* @param {string} options.bundleTempDir - 临时存放下载的包的目录
139148
* @returns {Array} - Vite插件数组
140149
*/
141-
export function localCdnPlugin({
142-
localCdnConfig = { importMap: { imports: {} }, copy: {} },
150+
export function importMapLocalPlugin({
151+
importMapLocalConfig = { importMap: { imports: {} }, copy: {} },
143152
base = './',
144153
cdnDir = 'local-cdn-static', // 构建目录中的CDN文件夹名称
145154
bundleTempDir = 'bundle-deps/local-cdn' // 临时存放下载的包的目录
146155
}) {
147-
const importMapConfig = localCdnConfig.importMap || { imports: {} }
148-
const copyConfig = localCdnConfig.copy || {}
156+
let importMapConfig = importMapLocalConfig.importMap
157+
158+
if (!importMapConfig || typeof importMapConfig !== 'object') {
159+
logger.warn('[import-map-local-plugin]: Invalid importMapLocalConfig, using defaults')
160+
161+
importMapConfig = { imports: {}, copy: {} }
162+
}
163+
164+
if (!importMapConfig.imports || typeof importMapConfig.imports !== 'object') {
165+
logger.warn('[import-map-local-plugin]: Invalid importMapConfig, using defaults')
166+
167+
importMapConfig.imports = {}
168+
}
169+
170+
if (!importMapConfig.copy || typeof importMapConfig.copy !== 'object') {
171+
logger.warn('[import-map-local-plugin]: Invalid copyConfig, using defaults')
172+
173+
importMapConfig.copy = {}
174+
}
175+
176+
const copyConfig = importMapConfig.copy || {}
149177
const defaultImportMapConfig = JSON.parse(
150178
fs.readFileSync(path.resolve(process.cwd(), './node_modules/@opentiny/tiny-engine/dist/import-map.json'), 'utf-8')
151179
)
@@ -157,7 +185,7 @@ export function localCdnPlugin({
157185
const combinedImportMapConfig = [...overriddenImportMap, ...parsedImportMapConfig]
158186

159187
if (combinedImportMapConfig.length === 0) {
160-
logger.warn('[local-cdn-plugin]: No CDN dependencies found or configured')
188+
logger.warn('[import-map-local-plugin]: No CDN dependencies found or configured')
161189
return []
162190
}
163191
const combinedCopyConfig = { ...defaultCopyConfig, ...copyConfig }
@@ -181,9 +209,9 @@ export function localCdnPlugin({
181209

182210
// 日志一下将要处理的内容
183211
logger.log(
184-
`[local-cdn-plugin]: Processing ${combinedImportMapConfig.length} CDN dependencies to local directory: ${cdnDir}`
212+
`[import-map-local-plugin]: Processing ${combinedImportMapConfig.length} CDN dependencies to local directory: ${cdnDir}`
185213
)
186-
logger.log(`[local-cdn-plugin]: Need to install ${packageNeedToInstall.length} packages`)
214+
logger.log(`[import-map-local-plugin]: Need to install ${packageNeedToInstall.length} packages`)
187215

188216
const targetFiles = dedupeCopyFiles(cdnFiles)
189217
// 返回插件数组

packages/build/vite-config/src/localCdnFile/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ export * from './copyPreviewImportMap.js'
44
export * from './utils.js'
55
export * from './locateCdnNpmInfo.js'
66
export * from './replaceImportPath.mjs'
7-
export * from './localCdnPlugin.js'
7+
export * from './importMapLocalPlugin.js'

packages/build/vite-config/src/vite-plugins/cdnCopyPlugin.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,6 @@ async function copyFileOrDirectory(srcPath, destPaths, copiedFiles, outDir) {
6969
// 确保目标目录存在
7070
await fs.ensureDir(path.dirname(fullDestPath))
7171

72-
logger.log(`[vite-cdn-copy-plugin]: Copying from ${srcPath} to ${fullDestPath}`)
73-
7472
if (isDirectory) {
7573
// 如果是目录,使用 fast-glob 遍历所有文件并处理
7674
logger.log(`[vite-cdn-copy-plugin]: Copying directory recursively: ${srcPath} -> ${fullDestPath}`)
@@ -99,8 +97,6 @@ async function copyFileOrDirectory(srcPath, destPaths, copiedFiles, outDir) {
9997

10098
await copyFile(srcPath, finalDestPath)
10199
}
102-
103-
logger.log(`[vite-cdn-copy-plugin]: Successfully copied: ${srcPath} -> ${fullDestPath}`)
104100
} catch (err) {
105101
logger.error(`[vite-cdn-copy-plugin]: Failed to copy ${srcPath} to ${fullDestPath}`, err)
106102
}

0 commit comments

Comments
 (0)