Skip to content

Commit 58bf3a7

Browse files
committed
build: implement monorepo structure and optimize build process
- Update build.config.ts to support monorepo structure - Modify package.json to use new module exports - Add generateEntries and update-package-exports scripts - Update README.md to reflect new Node module
1 parent 0abac3d commit 58bf3a7

File tree

7 files changed

+185
-30
lines changed

7 files changed

+185
-30
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ Below are the module categories available in the utility library:
7878
| [Finance](https://utils.ryanuo.cc/api/finance/) | [formatCurrency()](https://utils.ryanuo.cc/api/finance/functions/formatCurrency.html)[calculatePercentage()](https://utils.ryanuo.cc/api/finance/functions/calculatePercentage.html)[compare()](https://utils.ryanuo.cc/api/finance/functions/compare.html)[preciseAdd()](https://utils.ryanuo.cc/api/finance/functions/preciseAdd.html)[preciseDiv()](https://utils.ryanuo.cc/api/finance/functions/preciseDiv.html)[preciseMul()](https://utils.ryanuo.cc/api/finance/functions/preciseMul.html)[preciseSub()](https://utils.ryanuo.cc/api/finance/functions/preciseSub.html)[roundTo()](https://utils.ryanuo.cc/api/finance/functions/roundTo.html)[decimal()](https://utils.ryanuo.cc/api/finance/variables/decimal.html) |
7979
| [Graphics](https://utils.ryanuo.cc/api/graphics/) | [hexToRgba()](https://utils.ryanuo.cc/api/graphics/functions/hexToRgba.html)[lerpColor()](https://utils.ryanuo.cc/api/graphics/functions/lerpColor.html)[rgbaToHex()](https://utils.ryanuo.cc/api/graphics/functions/rgbaToHex.html) |
8080
| [Network](https://utils.ryanuo.cc/api/network/) | [checkNetworkStatus()](https://utils.ryanuo.cc/api/network/functions/checkNetworkStatus.html)[fetchWithTimeout()](https://utils.ryanuo.cc/api/network/functions/fetchWithTimeout.html)[getClientIP()](https://utils.ryanuo.cc/api/network/functions/getClientIP.html)[getIndexedDBCache()](https://utils.ryanuo.cc/api/network/functions/getIndexedDBCache.html)[parallelRequests()](https://utils.ryanuo.cc/api/network/functions/parallelRequests.html)[request()](https://utils.ryanuo.cc/api/network/functions/request.html) |
81-
| [Node](https://utils.ryanuo.cc/api/node/) | [logger()](https://utils.ryanuo.cc/api/node/variables/logger.html)[mkdirp()](https://utils.ryanuo.cc/api/node/functions/mkdirp.html)[rmrf()](https://utils.ryanuo.cc/api/node/functions/rmrf.html) |
81+
| [Node](https://utils.ryanuo.cc/api/node/) | [logger()](https://utils.ryanuo.cc/api/node/variables/logger.html)[createPathResolver()](https://utils.ryanuo.cc/api/node/functions/createPathResolver.html)[mkdirp()](https://utils.ryanuo.cc/api/node/functions/mkdirp.html)[rmrf()](https://utils.ryanuo.cc/api/node/functions/rmrf.html) |
8282
<!-- auto utils end -->
8383

8484
## License

build.config.ts

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,42 @@
1+
import { execSync } from 'node:child_process'
2+
import { rm } from 'node:fs'
3+
import { dirname, resolve } from 'node:path'
4+
import { fileURLToPath } from 'node:url'
15
import { defineBuildConfig } from 'unbuild'
6+
import generateEntries from './script/generateEntries'
7+
import updatePackageExports from './script/update-package-exports'
8+
9+
const __dirname = dirname(fileURLToPath(import.meta.url))
10+
const resolvePath = (p: string) => resolve(__dirname, p)
211

312
export default defineBuildConfig({
413
entries: [
5-
// default
614
'./src/index',
7-
{
8-
builder: 'mkdist',
9-
input: './src/node',
10-
outDir: './dist/node',
11-
format: 'esm',
12-
},
13-
{
14-
builder: 'mkdist',
15-
input: './src/node',
16-
outDir: './dist/node',
17-
format: 'cjs',
18-
ext: 'cjs',
19-
},
15+
...generateEntries(resolvePath('src')),
16+
],
17+
declaration: false,
18+
clean: false,
19+
externals: [
20+
'dayjs',
21+
'decimal.js',
22+
'query-string',
2023
],
21-
declaration: true,
22-
clean: true,
2324
rollup: {
2425
emitCJS: true,
26+
esbuild: {
27+
minify: true,
28+
},
29+
},
30+
hooks: {
31+
'build:prepare': () => {
32+
rm(resolvePath('dist'), () => {
33+
execSync('tsc -p tsconfig.build.json', {
34+
stdio: 'inherit',
35+
})
36+
console.warn('🎉 类型文件生成完成!')
37+
38+
updatePackageExports(resolvePath('src'), resolvePath('package.json'))
39+
})
40+
},
2541
},
2642
})

package.json

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,27 +31,54 @@
3131
"sideEffects": false,
3232
"exports": {
3333
".": {
34-
"types": "./dist/index.d.ts",
34+
"types": "./dist/types/index.d.ts",
3535
"import": "./dist/index.mjs",
3636
"require": "./dist/index.cjs"
3737
},
38+
"./ai": {
39+
"types": "./dist/types/ai/index.d.ts",
40+
"import": "./dist/lib/ai/index.mjs",
41+
"require": "./dist/lib/ai/index.cjs"
42+
},
43+
"./algorithm": {
44+
"types": "./dist/types/algorithm/index.d.ts",
45+
"import": "./dist/lib/algorithm/index.mjs",
46+
"require": "./dist/lib/algorithm/index.cjs"
47+
},
48+
"./browser": {
49+
"types": "./dist/types/browser/index.d.ts",
50+
"import": "./dist/lib/browser/index.mjs",
51+
"require": "./dist/lib/browser/index.cjs"
52+
},
53+
"./common": {
54+
"types": "./dist/types/common/index.d.ts",
55+
"import": "./dist/lib/common/index.mjs",
56+
"require": "./dist/lib/common/index.cjs"
57+
},
58+
"./finance": {
59+
"types": "./dist/types/finance/index.d.ts",
60+
"import": "./dist/lib/finance/index.mjs",
61+
"require": "./dist/lib/finance/index.cjs"
62+
},
63+
"./graphics": {
64+
"types": "./dist/types/graphics/index.d.ts",
65+
"import": "./dist/lib/graphics/index.mjs",
66+
"require": "./dist/lib/graphics/index.cjs"
67+
},
68+
"./network": {
69+
"types": "./dist/types/network/index.d.ts",
70+
"import": "./dist/lib/network/index.mjs",
71+
"require": "./dist/lib/network/index.cjs"
72+
},
3873
"./node": {
39-
"types": "./dist/node/index.d.ts",
40-
"import": "./dist/node/index.mjs",
41-
"require": "./dist/node/index.cjs"
74+
"types": "./dist/types/node/index.d.ts",
75+
"import": "./dist/lib/node/index.mjs",
76+
"require": "./dist/lib/node/index.cjs"
4277
}
4378
},
4479
"main": "./dist/index.mjs",
4580
"module": "./dist/index.mjs",
46-
"types": "./dist/index.d.ts",
47-
"typesVersions": {
48-
"*": {
49-
"*": [
50-
"./dist/*",
51-
"./dist/index.d.ts"
52-
]
53-
}
54-
},
81+
"types": "./dist/types/index.d.ts",
5582
"files": [
5683
"dist"
5784
],
@@ -75,6 +102,7 @@
75102
},
76103
"devDependencies": {
77104
"@antfu/eslint-config": "catalog:dev",
105+
"@ryanuo/utils": "workspace:*",
78106
"@types/node": "catalog:dev",
79107
"bumpp": "catalog:dev",
80108
"eslint": "catalog:dev",

pnpm-lock.yaml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

script/generateEntries.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { readdirSync } from 'node:fs'
2+
import type { BuildEntry } from 'unbuild'
3+
4+
// 扫描 src 目录下的所有子模块
5+
function scanModules(srcDir: string): string[] {
6+
return readdirSync(srcDir, { withFileTypes: true })
7+
.filter(dirent => dirent.isDirectory())
8+
.map(dirent => dirent.name)
9+
}
10+
11+
// 生成每个模块的构建配置
12+
function generateEntries(srcDir: string): BuildEntry[] {
13+
const modules = scanModules(srcDir)
14+
const entries: BuildEntry[] = []
15+
16+
modules.forEach((module) => {
17+
entries.push(
18+
{
19+
builder: 'mkdist',
20+
input: `./src/${module}`,
21+
outDir: `./dist/lib/${module}`,
22+
format: 'esm',
23+
},
24+
{
25+
builder: 'mkdist',
26+
input: `./src/${module}`,
27+
outDir: `./dist/lib/${module}`,
28+
format: 'cjs',
29+
ext: 'cjs',
30+
},
31+
)
32+
})
33+
34+
return entries
35+
}
36+
37+
export default generateEntries

script/update-package-exports.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// scripts/update-package-exports.ts
2+
import fs from 'node:fs'
3+
4+
// 定义导出配置项的类型
5+
interface ExportEntry {
6+
types: string
7+
import: string
8+
require: string
9+
}
10+
11+
// 扫描指定目录下的所有子模块
12+
function scanModules(srcDir: string): string[] {
13+
return fs.readdirSync(srcDir, { withFileTypes: true })
14+
.filter(dirent => dirent.isDirectory())
15+
.map(dirent => dirent.name)
16+
}
17+
18+
// 生成模块的导出配置
19+
function generateExportConfig(moduleName: string): ExportEntry {
20+
return {
21+
types: `./dist/types/${moduleName}/index.d.ts`,
22+
import: `./dist/lib/${moduleName}/index.mjs`,
23+
require: `./dist/lib/${moduleName}/index.cjs`,
24+
}
25+
}
26+
27+
// 更新 package.json 的 exports 字段
28+
function updatePackageExports(srcDir: string, packageJsonPath: string): void {
29+
// 读取并解析 package.json
30+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))
31+
32+
// 初始化 exports 对象
33+
const exportsConfig: Record<string, ExportEntry> = {
34+
'.': {
35+
types: './dist/types/index.d.ts',
36+
import: './dist/index.mjs',
37+
require: './dist/index.cjs',
38+
},
39+
}
40+
41+
// 为每个模块生成导出配置
42+
const modules = scanModules(srcDir)
43+
modules.forEach((module) => {
44+
exportsConfig[`./${module}`] = generateExportConfig(module)
45+
})
46+
47+
// 更新 package.json
48+
packageJson.exports = exportsConfig
49+
50+
// 写回文件,保持格式一致
51+
fs.writeFileSync(
52+
packageJsonPath,
53+
`${JSON.stringify(packageJson, null, 2)}\n`,
54+
)
55+
56+
console.warn('✅ package.json 的 exports 字段已更新')
57+
}
58+
59+
export default updatePackageExports

tsconfig.build.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"extends": "./tsconfig.json",
3+
"compilerOptions": {
4+
"strict": true,
5+
"declaration": true,
6+
"declarationDir": "./dist/types",
7+
"emitDeclarationOnly": true,
8+
"skipLibCheck": true
9+
},
10+
"include": ["src/**/*.ts"],
11+
"exclude": ["node_modules", "tests"]
12+
}

0 commit comments

Comments
 (0)