@icebreakers/monorepo 3.1.17 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/cli.cjs +43 -27
- package/dist/cli.mjs +33 -15
- package/dist/index.cjs +25 -6
- package/dist/index.d.cts +56 -37
- package/dist/index.d.mts +56 -37
- package/dist/index.mjs +2 -2
- package/dist/{upgrade-BAwEMf4L.mjs → upgrade-CXX-ziub.mjs} +156 -175
- package/dist/{upgrade-Cw-ACn0l.cjs → upgrade-DuK9YfNz.cjs} +160 -192
- package/package.json +6 -11
- package/resources/skills/icebreakers-monorepo-cli/SKILL.md +43 -0
- package/resources/skills/icebreakers-monorepo-cli/references/commands.md +75 -0
- package/resources/skills/icebreakers-monorepo-cli/references/config.md +63 -0
- package/resources/skills/icebreakers-monorepo-cli/references/templates.md +21 -0
- package/assets/.changeset/config.json +0 -16
- package/assets/.dockerignore +0 -44
- package/assets/.editorconfig +0 -12
- package/assets/.gitattributes +0 -218
- package/assets/.github/FUNDING.yml +0 -4
- package/assets/.github/ISSUE_TEMPLATE/bug_report.yml +0 -71
- package/assets/.github/ISSUE_TEMPLATE/config.yml +0 -17
- package/assets/.github/workflows/ci.yml +0 -62
- package/assets/.github/workflows/release.yml +0 -57
- package/assets/.husky/commit-msg +0 -4
- package/assets/.husky/pre-commit +0 -4
- package/assets/.vscode/extensions.json +0 -6
- package/assets/.vscode/settings.json +0 -172
- package/assets/CODE_OF_CONDUCT.md +0 -128
- package/assets/CONTRIBUTING.md +0 -3
- package/assets/Dockerfile +0 -27
- package/assets/SECURITY.md +0 -21
- package/assets/commitlint.config.ts +0 -3
- package/assets/eslint.config.js +0 -7
- package/assets/gitignore +0 -38
- package/assets/lint-staged.config.js +0 -11
- package/assets/monorepo.config.ts +0 -22
- package/assets/netlify.toml +0 -14
- package/assets/package.json +0 -88
- package/assets/pnpm-workspace.yaml +0 -10
- package/assets/renovate.json +0 -28
- package/assets/stylelint.config.js +0 -3
- package/assets/tsconfig.json +0 -51
- package/assets/turbo.json +0 -74
- package/assets/vitest.config.ts +0 -123
- package/templates/apps/cli/bin/index.js +0 -2
- package/templates/apps/cli/dev/index.ts +0 -2
- package/templates/apps/cli/gitignore +0 -2
- package/templates/apps/cli/package.json +0 -35
- package/templates/apps/cli/src/cli.ts +0 -4
- package/templates/apps/cli/src/index.ts +0 -15
- package/templates/apps/cli/tsconfig.json +0 -7
- package/templates/apps/cli/tsup.config.ts +0 -13
- package/templates/apps/client/eslint.config.js +0 -12
- package/templates/apps/client/gitignore +0 -28
- package/templates/apps/client/index.html +0 -13
- package/templates/apps/client/package.json +0 -52
- package/templates/apps/client/public/vite.svg +0 -1
- package/templates/apps/client/src/App.vue +0 -11
- package/templates/apps/client/src/main.ts +0 -16
- package/templates/apps/client/src/pages/index.vue +0 -357
- package/templates/apps/client/src/query-keys.ts +0 -4
- package/templates/apps/client/src/router/index.ts +0 -13
- package/templates/apps/client/src/stores/i18n.ts +0 -24
- package/templates/apps/client/src/stores/index.ts +0 -15
- package/templates/apps/client/src/style.css +0 -1
- package/templates/apps/client/src/trpc/index.ts +0 -10
- package/templates/apps/client/src/vite-env.d.ts +0 -2
- package/templates/apps/client/tsconfig.app.json +0 -28
- package/templates/apps/client/tsconfig.json +0 -8
- package/templates/apps/client/tsconfig.node.json +0 -25
- package/templates/apps/client/tsconfig.worker.json +0 -11
- package/templates/apps/client/vite.config.ts +0 -57
- package/templates/apps/client/worker/app.ts +0 -24
- package/templates/apps/client/worker/config.ts +0 -1
- package/templates/apps/client/worker/fetch-entry.ts +0 -5
- package/templates/apps/client/worker/node-entry.ts +0 -13
- package/templates/apps/client/worker/trpc-router.ts +0 -24
- package/templates/apps/client/wrangler.jsonc +0 -24
- package/templates/apps/server/gitignore +0 -2
- package/templates/apps/server/package.json +0 -60
- package/templates/apps/server/src/app.ts +0 -191
- package/templates/apps/server/src/config.ts +0 -1
- package/templates/apps/server/src/fetch-entry.ts +0 -5
- package/templates/apps/server/src/node-entry.ts +0 -13
- package/templates/apps/server/test/index.test.ts +0 -14
- package/templates/apps/server/tsconfig.json +0 -24
- package/templates/apps/server/tsup.config.ts +0 -13
- package/templates/apps/server/vitest.config.ts +0 -15
- package/templates/apps/server/wrangler.jsonc +0 -18
- package/templates/apps/website/.vitepress/config.ts +0 -93
- package/templates/apps/website/.vitepress/theme/index.ts +0 -4
- package/templates/apps/website/.vitepress/theme/tailwind.css +0 -1
- package/templates/apps/website/gitignore +0 -1
- package/templates/apps/website/index.md +0 -127
- package/templates/apps/website/monorepo/index.md +0 -46
- package/templates/apps/website/monorepo/manage.md +0 -126
- package/templates/apps/website/monorepo/publish.md +0 -142
- package/templates/apps/website/package.json +0 -39
- package/templates/apps/website/public/logo.jpg +0 -0
- package/templates/apps/website/thinking.md +0 -88
- package/templates/apps/website/tools/changeset.md +0 -87
- package/templates/apps/website/tools/husky.md +0 -108
- package/templates/apps/website/tools/lint-staged.md +0 -79
- package/templates/apps/website/tools/pnpm.md +0 -100
- package/templates/apps/website/tools/renovate.md +0 -91
- package/templates/apps/website/tools/turborepo.md +0 -149
- package/templates/apps/website/why/assets/npm-dt.svg +0 -15
- package/templates/apps/website/why/assets/npm-ts.svg +0 -19
- package/templates/apps/website/why/examples/0.npm-basic-package/index.js +0 -10
- package/templates/apps/website/why/examples/0.npm-basic-package/package.json +0 -11
- package/templates/apps/website/why/examples/1.npm-basic-package/index.cjs +0 -12
- package/templates/apps/website/why/examples/1.npm-basic-package/index.d.ts +0 -1
- package/templates/apps/website/why/examples/1.npm-basic-package/index.js +0 -8
- package/templates/apps/website/why/examples/1.npm-basic-package/package.json +0 -19
- package/templates/apps/website/why/examples/2.npm-basic-package/README.md +0 -1
- package/templates/apps/website/why/examples/2.npm-basic-package/package-lock.json +0 -30
- package/templates/apps/website/why/examples/2.npm-basic-package/package.json +0 -35
- package/templates/apps/website/why/examples/2.npm-basic-package/rename-ext.js +0 -24
- package/templates/apps/website/why/examples/2.npm-basic-package/src/index.ts +0 -8
- package/templates/apps/website/why/examples/2.npm-basic-package/tsconfig.cjs.json +0 -8
- package/templates/apps/website/why/examples/2.npm-basic-package/tsconfig.esm.json +0 -7
- package/templates/apps/website/why/examples/2.npm-basic-package/tsconfig.json +0 -18
- package/templates/apps/website/why/examples/3.npm-basic-package/README.md +0 -1
- package/templates/apps/website/why/examples/3.npm-basic-package/build.config.ts +0 -24
- package/templates/apps/website/why/examples/3.npm-basic-package/package-lock.json +0 -3661
- package/templates/apps/website/why/examples/3.npm-basic-package/package.json +0 -32
- package/templates/apps/website/why/examples/3.npm-basic-package/src/index.ts +0 -8
- package/templates/apps/website/why/examples/3.npm-basic-package/tsconfig.json +0 -16
- package/templates/apps/website/why/examples/3.npm-basic-package/tsup.config.ts +0 -16
- package/templates/apps/website/why/examples/usage-cjs/cjs.cjs +0 -4
- package/templates/apps/website/why/examples/usage-cjs/esm.mjs +0 -4
- package/templates/apps/website/why/examples/usage-cjs/index.js +0 -12
- package/templates/apps/website/why/examples/usage-cjs/package-lock.json +0 -42
- package/templates/apps/website/why/examples/usage-cjs/package.json +0 -20
- package/templates/apps/website/why/examples/usage-esm/cjs.cjs +0 -4
- package/templates/apps/website/why/examples/usage-esm/createRequire.js +0 -7
- package/templates/apps/website/why/examples/usage-esm/esm.mjs +0 -4
- package/templates/apps/website/why/examples/usage-esm/index.js +0 -8
- package/templates/apps/website/why/examples/usage-esm/package-lock.json +0 -42
- package/templates/apps/website/why/examples/usage-esm/package.json +0 -21
- package/templates/apps/website/why/how-to-reuse-js-code.md +0 -250
- package/templates/apps/website/why/index.md +0 -1
- package/templates/apps/website/why/js-cjs-mjs.md +0 -99
- package/templates/apps/website/why/js-keywords.md +0 -132
- package/templates/apps/website/why/modern/bundlers.md +0 -79
- package/templates/apps/website/why/modern/dts.md +0 -93
- package/templates/apps/website/why/modern/esm-vs-cjs.md +0 -84
- package/templates/apps/website/why/modern/index.md +0 -55
- package/templates/apps/website/why/modern/package-entry-points.md +0 -128
- package/templates/apps/website/why/modern/typescript.md +0 -155
- package/templates/apps/website/why/publish-basic-npm-package.md +0 -146
- package/templates/apps/website/why/what-is-npm-package.md +0 -162
- package/templates/packages/tsdown-template/package.json +0 -47
- package/templates/packages/tsdown-template/src/index.ts +0 -5
- package/templates/packages/tsdown-template/test/index.test.ts +0 -11
- package/templates/packages/tsdown-template/tsconfig.json +0 -15
- package/templates/packages/tsdown-template/tsdown.config.ts +0 -9
- package/templates/packages/tsdown-template/vitest.config.ts +0 -15
- package/templates/packages/tsup-template/build.config.ts +0 -24
- package/templates/packages/tsup-template/package.json +0 -48
- package/templates/packages/tsup-template/src/index.ts +0 -12
- package/templates/packages/tsup-template/test/index.test.ts +0 -18
- package/templates/packages/tsup-template/tsconfig.json +0 -15
- package/templates/packages/tsup-template/tsup.config.ts +0 -18
- package/templates/packages/tsup-template/vitest.config.ts +0 -15
- package/templates/packages/unbuild-template/build.config.ts +0 -24
- package/templates/packages/unbuild-template/package.json +0 -48
- package/templates/packages/unbuild-template/src/index.ts +0 -9
- package/templates/packages/unbuild-template/src/utils.ts +0 -3
- package/templates/packages/unbuild-template/test/index.test.ts +0 -18
- package/templates/packages/unbuild-template/tsconfig.json +0 -15
- package/templates/packages/unbuild-template/vitest.config.ts +0 -15
- package/templates/packages/vue-lib-template/eslint.config.js +0 -12
- package/templates/packages/vue-lib-template/gitignore +0 -1
- package/templates/packages/vue-lib-template/index.html +0 -13
- package/templates/packages/vue-lib-template/lib/HelloWorld.vue +0 -21
- package/templates/packages/vue-lib-template/lib/index.ts +0 -3
- package/templates/packages/vue-lib-template/package.json +0 -61
- package/templates/packages/vue-lib-template/src/App.vue +0 -9
- package/templates/packages/vue-lib-template/src/main.ts +0 -8
- package/templates/packages/vue-lib-template/src/pages/index.vue +0 -7
- package/templates/packages/vue-lib-template/src/router/index.ts +0 -11
- package/templates/packages/vue-lib-template/src/style.css +0 -1
- package/templates/packages/vue-lib-template/src/vite-env.d.ts +0 -2
- package/templates/packages/vue-lib-template/test/index.test.ts +0 -13
- package/templates/packages/vue-lib-template/tsconfig.app.json +0 -30
- package/templates/packages/vue-lib-template/tsconfig.json +0 -14
- package/templates/packages/vue-lib-template/tsconfig.node.json +0 -25
- package/templates/packages/vue-lib-template/tsconfig.test.json +0 -40
- package/templates/packages/vue-lib-template/vite.config.ts +0 -54
- package/templates/packages/vue-lib-template/vite.shared.config.ts +0 -13
- package/templates/packages/vue-lib-template/vitest.config.ts +0 -13
- /package/{assets/LICENSE → LICENSE} +0 -0
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "icebreaker-npm-basic-package",
|
|
3
|
-
"type": "module",
|
|
4
|
-
"version": "1.0.5",
|
|
5
|
-
"description": "",
|
|
6
|
-
"author": "",
|
|
7
|
-
"license": "ISC",
|
|
8
|
-
"exports": {
|
|
9
|
-
".": {
|
|
10
|
-
"types": "./dist/index.d.ts",
|
|
11
|
-
"import": "./dist/index.mjs",
|
|
12
|
-
"require": "./dist/index.cjs"
|
|
13
|
-
}
|
|
14
|
-
},
|
|
15
|
-
"main": "./dist/index.cjs",
|
|
16
|
-
"module": "./dist/index.mjs",
|
|
17
|
-
"types": "./dist/index.d.ts",
|
|
18
|
-
"files": [
|
|
19
|
-
"dist"
|
|
20
|
-
],
|
|
21
|
-
"scripts": {
|
|
22
|
-
"dev": "unbuild --stub",
|
|
23
|
-
"build:watch": "tsup --watch --sourcemap",
|
|
24
|
-
"build": "tsup"
|
|
25
|
-
},
|
|
26
|
-
"devDependencies": {
|
|
27
|
-
"tsup": "^8.5.0",
|
|
28
|
-
"tsx": "^4.19.4",
|
|
29
|
-
"typescript": "^5.8.3",
|
|
30
|
-
"unbuild": "^3.5.0"
|
|
31
|
-
}
|
|
32
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ESNext",
|
|
4
|
-
"module": "ESNext",
|
|
5
|
-
"moduleResolution": "Bundler",
|
|
6
|
-
"resolveJsonModule": true,
|
|
7
|
-
"allowJs": true,
|
|
8
|
-
"strict": true,
|
|
9
|
-
"allowSyntheticDefaultImports": true,
|
|
10
|
-
"esModuleInterop": true,
|
|
11
|
-
"skipLibCheck": true
|
|
12
|
-
},
|
|
13
|
-
"include": [
|
|
14
|
-
"src"
|
|
15
|
-
]
|
|
16
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { defineConfig } from 'tsup'
|
|
2
|
-
|
|
3
|
-
export default defineConfig({
|
|
4
|
-
entry: ['src/index.ts'],
|
|
5
|
-
shims: true,
|
|
6
|
-
format: ['cjs', 'esm'],
|
|
7
|
-
clean: true,
|
|
8
|
-
dts: true,
|
|
9
|
-
cjsInterop: true,
|
|
10
|
-
splitting: true,
|
|
11
|
-
outExtension({ format }) {
|
|
12
|
-
return {
|
|
13
|
-
js: `.${format === 'esm' ? 'mjs' : 'cjs'}`,
|
|
14
|
-
}
|
|
15
|
-
},
|
|
16
|
-
})
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
// import c from 'chalk'
|
|
3
|
-
// const c = require('chalk')
|
|
4
|
-
const { sayHello } = require('icebreaker-npm-basic-package')
|
|
5
|
-
const { sayHello: sayHelloCjs } = require('icebreaker-npm-basic-package-multiple-exports')
|
|
6
|
-
|
|
7
|
-
sayHello()
|
|
8
|
-
sayHelloCjs()
|
|
9
|
-
|
|
10
|
-
import('chalk').then(({ default: c }) => {
|
|
11
|
-
console.log(c.green('Hello World!'))
|
|
12
|
-
})
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "usage-cjs",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"lockfileVersion": 3,
|
|
5
|
-
"requires": true,
|
|
6
|
-
"packages": {
|
|
7
|
-
"": {
|
|
8
|
-
"name": "usage-cjs",
|
|
9
|
-
"version": "1.0.0",
|
|
10
|
-
"license": "ISC",
|
|
11
|
-
"dependencies": {
|
|
12
|
-
"chalk": "^5.6.2",
|
|
13
|
-
"icebreaker-npm-basic-package": "^1.0.5",
|
|
14
|
-
"icebreaker-npm-basic-package-multiple-exports": "^0.0.0"
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
"node_modules/chalk": {
|
|
18
|
-
"version": "5.6.2",
|
|
19
|
-
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
|
|
20
|
-
"integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
|
|
21
|
-
"license": "MIT",
|
|
22
|
-
"engines": {
|
|
23
|
-
"node": "^12.17.0 || ^14.13 || >=16.0.0"
|
|
24
|
-
},
|
|
25
|
-
"funding": {
|
|
26
|
-
"url": "https://github.com/chalk/chalk?sponsor=1"
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
"node_modules/icebreaker-npm-basic-package": {
|
|
30
|
-
"version": "1.0.5",
|
|
31
|
-
"resolved": "https://registry.npmjs.org/icebreaker-npm-basic-package/-/icebreaker-npm-basic-package-1.0.5.tgz",
|
|
32
|
-
"integrity": "sha512-tWDfJzIKb61L1hTM25dtjgBi1vljZZc16ummy5MqGEpCxf8eQAVLq3ZPq9TbHn0+pAXN2+OlFBBpPTvZuP/wUg==",
|
|
33
|
-
"license": "ISC"
|
|
34
|
-
},
|
|
35
|
-
"node_modules/icebreaker-npm-basic-package-multiple-exports": {
|
|
36
|
-
"version": "0.0.0",
|
|
37
|
-
"resolved": "https://registry.npmjs.org/icebreaker-npm-basic-package-multiple-exports/-/icebreaker-npm-basic-package-multiple-exports-0.0.0.tgz",
|
|
38
|
-
"integrity": "sha512-JZh7KXHzUsS9JlqOa0bjTM1i3xwAGHp3JBmK/kApZmZx7It8HfpE5vY98EAdjOHfVcCHKzJc24tkR1t2dv2dvA==",
|
|
39
|
-
"license": "ISC"
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "usage-cjs",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"private": true,
|
|
5
|
-
"description": "",
|
|
6
|
-
"author": "",
|
|
7
|
-
"license": "ISC",
|
|
8
|
-
"keywords": [],
|
|
9
|
-
"main": "index.js",
|
|
10
|
-
"scripts": {
|
|
11
|
-
"start": "node .",
|
|
12
|
-
"esm": "node esm.mjs",
|
|
13
|
-
"cjs": "node cjs.cjs"
|
|
14
|
-
},
|
|
15
|
-
"dependencies": {
|
|
16
|
-
"chalk": "^5.6.2",
|
|
17
|
-
"icebreaker-npm-basic-package": "^1.0.5",
|
|
18
|
-
"icebreaker-npm-basic-package-multiple-exports": "^0.0.0"
|
|
19
|
-
}
|
|
20
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
import c from 'chalk'
|
|
3
|
-
import { sayHello } from 'icebreaker-npm-basic-package'
|
|
4
|
-
import { sayHello as sayHello2 } from 'icebreaker-npm-basic-package-multiple-exports'
|
|
5
|
-
|
|
6
|
-
sayHello()
|
|
7
|
-
sayHello2()
|
|
8
|
-
console.log(c.green('Hello World!'))
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "usage-esm",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"lockfileVersion": 3,
|
|
5
|
-
"requires": true,
|
|
6
|
-
"packages": {
|
|
7
|
-
"": {
|
|
8
|
-
"name": "usage-esm",
|
|
9
|
-
"version": "1.0.0",
|
|
10
|
-
"license": "ISC",
|
|
11
|
-
"dependencies": {
|
|
12
|
-
"chalk": "^5.6.2",
|
|
13
|
-
"icebreaker-npm-basic-package": "1.0.5",
|
|
14
|
-
"icebreaker-npm-basic-package-multiple-exports": "^0.0.0"
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
"node_modules/chalk": {
|
|
18
|
-
"version": "5.6.2",
|
|
19
|
-
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
|
|
20
|
-
"integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
|
|
21
|
-
"license": "MIT",
|
|
22
|
-
"engines": {
|
|
23
|
-
"node": "^12.17.0 || ^14.13 || >=16.0.0"
|
|
24
|
-
},
|
|
25
|
-
"funding": {
|
|
26
|
-
"url": "https://github.com/chalk/chalk?sponsor=1"
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
"node_modules/icebreaker-npm-basic-package": {
|
|
30
|
-
"version": "1.0.5",
|
|
31
|
-
"resolved": "https://registry.npmjs.org/icebreaker-npm-basic-package/-/icebreaker-npm-basic-package-1.0.5.tgz",
|
|
32
|
-
"integrity": "sha512-tWDfJzIKb61L1hTM25dtjgBi1vljZZc16ummy5MqGEpCxf8eQAVLq3ZPq9TbHn0+pAXN2+OlFBBpPTvZuP/wUg==",
|
|
33
|
-
"license": "ISC"
|
|
34
|
-
},
|
|
35
|
-
"node_modules/icebreaker-npm-basic-package-multiple-exports": {
|
|
36
|
-
"version": "0.0.0",
|
|
37
|
-
"resolved": "https://registry.npmjs.org/icebreaker-npm-basic-package-multiple-exports/-/icebreaker-npm-basic-package-multiple-exports-0.0.0.tgz",
|
|
38
|
-
"integrity": "sha512-JZh7KXHzUsS9JlqOa0bjTM1i3xwAGHp3JBmK/kApZmZx7It8HfpE5vY98EAdjOHfVcCHKzJc24tkR1t2dv2dvA==",
|
|
39
|
-
"license": "ISC"
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "usage-esm",
|
|
3
|
-
"type": "module",
|
|
4
|
-
"version": "1.0.0",
|
|
5
|
-
"private": true,
|
|
6
|
-
"description": "",
|
|
7
|
-
"author": "",
|
|
8
|
-
"license": "ISC",
|
|
9
|
-
"keywords": [],
|
|
10
|
-
"main": "index.js",
|
|
11
|
-
"scripts": {
|
|
12
|
-
"start": "node .",
|
|
13
|
-
"esm": "node esm.mjs",
|
|
14
|
-
"cjs": "node cjs.cjs"
|
|
15
|
-
},
|
|
16
|
-
"dependencies": {
|
|
17
|
-
"chalk": "^5.6.2",
|
|
18
|
-
"icebreaker-npm-basic-package": "1.0.5",
|
|
19
|
-
"icebreaker-npm-basic-package-multiple-exports": "^0.0.0"
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
outline: [2, 4]
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# 如何复用 js 代码
|
|
6
|
-
|
|
7
|
-
我们知道,不论在什么编程语言里,复用代码最简单的方案就是 `复制粘贴`
|
|
8
|
-
|
|
9
|
-
然而,复制粘贴会导致代码冗余、难以维护,修改一处逻辑时易漏改其它处,增加出错概率,违背“不要重复自己”(DRY)原则。
|
|
10
|
-
|
|
11
|
-
假如人人写代码都复制粘贴,这会造成一个工程化的地狱,后期维护成本急剧升高。
|
|
12
|
-
|
|
13
|
-
为此我们需要有效利用 `模块化` 的思路,去提炼,拆分,复用我们写的代码。
|
|
14
|
-
|
|
15
|
-
## **代码的模块化**
|
|
16
|
-
|
|
17
|
-
在现代 `JavaScript` 开发中,**模块化**不仅是一种组织代码的结构化方式,更是实现高效代码复用的核心前提。
|
|
18
|
-
|
|
19
|
-
### 模块化是复用的基础
|
|
20
|
-
|
|
21
|
-
1. **明确边界,职责单一**
|
|
22
|
-
模块化将一个大程序拆分为职责清晰、相互独立的功能块(模块)。每个模块完成一个单一任务,这种**高内聚、低耦合**的结构,为复用提供了天然的土壤。
|
|
23
|
-
|
|
24
|
-
2. **清晰的导入导出机制**
|
|
25
|
-
通过标准的 `export` 和 `import`(或 `CommonJS` 的 `module.exports` / `require`),开发者可以在不同文件、不同项目中复用相同模块,而无需复制粘贴代码。
|
|
26
|
-
|
|
27
|
-
3. **便于维护与测试**
|
|
28
|
-
模块是可单独测试、维护的最小单元。模块化设计使得一个功能变化不会影响其他模块,增强了系统的稳定性和可扩展性。
|
|
29
|
-
|
|
30
|
-
4. **为构建通用库打下基础**
|
|
31
|
-
工具函数库(如 `lodash/es-toolkit`)、业务中间件、配置模块、数据处理逻辑等,都是基于模块化原则设计的。只有当代码被封装为模块,它才可能被提取、封装、共享、发布。
|
|
32
|
-
|
|
33
|
-
### 模块化让复用从被动到主动
|
|
34
|
-
|
|
35
|
-
非模块化时代的“复用”往往是:
|
|
36
|
-
|
|
37
|
-
- 复制粘贴代码
|
|
38
|
-
- 修改适配不同上下文
|
|
39
|
-
|
|
40
|
-
而模块化之后,“复用”变成了:
|
|
41
|
-
|
|
42
|
-
- 明确接口,按需引入
|
|
43
|
-
- 参数化、配置化、可扩展
|
|
44
|
-
|
|
45
|
-
这不仅是形式上的进步,更是软件工程层面的范式跃迁。
|
|
46
|
-
|
|
47
|
-
### js 模块的典型格式
|
|
48
|
-
|
|
49
|
-
- **ES Modules(现代浏览器/现代 Node.js)**:标准、推荐,使用 `import` / `export`
|
|
50
|
-
- **CommonJS(传统 Node.js)**:使用 `require` / `module.exports`
|
|
51
|
-
- **UMD / IIFE / SystemJS / AMD**:一些老式模块化兼容方案,仍用于一些库的打包格式
|
|
52
|
-
|
|
53
|
-
#### ES Modules (ESM)
|
|
54
|
-
|
|
55
|
-
目前大部分新的 `npm` 包都使用这个格式发包,
|
|
56
|
-
|
|
57
|
-
它最大的特点是,使用 `export` / `import` 将功能函数、类、常量等分别放入独立 `.js` 文件中,动态引入的使用 `import()` 进行引入
|
|
58
|
-
|
|
59
|
-
```js
|
|
60
|
-
// utils/math.js
|
|
61
|
-
export function add(a, b) {
|
|
62
|
-
return a + b
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export function multiply(a, b) {
|
|
66
|
-
return a * b
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
```js
|
|
71
|
-
// main.js
|
|
72
|
-
import { add, multiply } from './utils/math'
|
|
73
|
-
|
|
74
|
-
console.log(add(2, 3)) // 5
|
|
75
|
-
console.log(multiply(2, 3)) // 6
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
**这是目前的主流,也是未来的方向**
|
|
79
|
-
|
|
80
|
-
注意事项:
|
|
81
|
-
|
|
82
|
-
- 在浏览器中引入,需要使用 `<script type="module">`
|
|
83
|
-
- 在 `Node.js` 中需要 `package.json` 设置 `"type": "module"`
|
|
84
|
-
|
|
85
|
-
---
|
|
86
|
-
|
|
87
|
-
#### CommonJS (CJS)
|
|
88
|
-
|
|
89
|
-
在 `ESM` 规范没有被确立之前的社区模块化方案,低版本 `Node.js` 环境使用,高版本 `Node.js` 同时兼容 `CJS` 和 `ESM` 2 种模块化方案和加载策略
|
|
90
|
-
|
|
91
|
-
最大的特点为,使用 `require` / `module.exports`(`commonjs2`) / `exports`(`commonjs`) 进行模块化
|
|
92
|
-
|
|
93
|
-
```js
|
|
94
|
-
// utils/math.js
|
|
95
|
-
function add(a, b) {
|
|
96
|
-
return a + b
|
|
97
|
-
}
|
|
98
|
-
module.exports = { add }
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
```js
|
|
102
|
-
// app.js
|
|
103
|
-
const { add } = require('./utils/math.js')
|
|
104
|
-
|
|
105
|
-
console.log(add(5, 10))
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
新的包不会使用这个格式,目前这个格式的 `npm` 包,也正在逐步向 `ESM` 格式进行迁移
|
|
109
|
-
|
|
110
|
-
#### AMD (Asynchronous Module Definition)
|
|
111
|
-
|
|
112
|
-
AMD 是 RequireJS 推广的模块格式,支持异步加载模块,适用于浏览器。
|
|
113
|
-
|
|
114
|
-
```js
|
|
115
|
-
define('myLib', [], () => {
|
|
116
|
-
function hello() {
|
|
117
|
-
return 'Hello from AMD'
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
return {
|
|
121
|
-
hello
|
|
122
|
-
}
|
|
123
|
-
})
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
**已经过时,不要使用!**
|
|
127
|
-
|
|
128
|
-
#### UMD (Universal Module Definition)
|
|
129
|
-
|
|
130
|
-
UMD 是为了同时兼容 CommonJS、AMD 和浏览器环境而设计的模块格式。
|
|
131
|
-
|
|
132
|
-
```js
|
|
133
|
-
(function (root, factory) {
|
|
134
|
-
if (typeof define === 'function' && define.amd) {
|
|
135
|
-
// AMD
|
|
136
|
-
define([], factory)
|
|
137
|
-
}
|
|
138
|
-
else if (typeof module === 'object' && module.exports) {
|
|
139
|
-
// CommonJS
|
|
140
|
-
module.exports = factory()
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
// Browser global
|
|
144
|
-
root.myLib = factory()
|
|
145
|
-
}
|
|
146
|
-
}(this, () => {
|
|
147
|
-
// 模块内容
|
|
148
|
-
function hello() {
|
|
149
|
-
return 'Hello from UMD'
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
return {
|
|
153
|
-
hello
|
|
154
|
-
}
|
|
155
|
-
}))
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
通常在你使用 `vite` 的 `lib` 模式的时候,除了会打一个 `ESM` 包之外,也会打一个 `UMD` 的包,用于 `CDN` + `SSR` 场景下使用。
|
|
159
|
-
|
|
160
|
-
#### IIFE (Immediately Invoked Function Expression)
|
|
161
|
-
|
|
162
|
-
IIFE 是立即执行函数表达式,常用于浏览器中,通常暴露到 `window` 上(无模块系统时的“模拟模块”方式)。
|
|
163
|
-
|
|
164
|
-
https://developer.mozilla.org/en-US/docs/Glossary/IIFE
|
|
165
|
-
|
|
166
|
-
```js
|
|
167
|
-
(function () {
|
|
168
|
-
function hello() {
|
|
169
|
-
console.log('Hello from IIFE')
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// 暴露到全局
|
|
173
|
-
window.myLib = {
|
|
174
|
-
hello
|
|
175
|
-
}
|
|
176
|
-
})()
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
#### SystemJS / System.register
|
|
180
|
-
|
|
181
|
-
`System` 是由 `ES6 Module Loader` 提出的一种格式,现代打包工具(如 `Rollup`)可以输出此格式,用于运行时动态加载 `ES Modules`。
|
|
182
|
-
|
|
183
|
-
`SystemJS` 就是帮助你在不支持原生 `ESM` 格式的浏览器上(比如IE11),使用 `ESM` 格式
|
|
184
|
-
|
|
185
|
-
```js
|
|
186
|
-
System.register(['./constants'], (exports) => {
|
|
187
|
-
return {
|
|
188
|
-
execute() {
|
|
189
|
-
function hello() {
|
|
190
|
-
console.log('Hello from System')
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
exports('hello', hello)
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
})
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
加载方式(需要 `SystemJS` 库):
|
|
200
|
-
|
|
201
|
-
```html
|
|
202
|
-
<script src="https://cdn.jsdelivr.net/npm/systemjs/dist/system.js"></script>
|
|
203
|
-
<script>
|
|
204
|
-
System.import('/path/to/your-module.js').then(({ hello }) => hello())
|
|
205
|
-
</script>
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
比如 `@vitejs/plugin-legacy` 这个浏览器降级兼容方案,就是使用 `SystemJS` 在老旧的浏览器里面,加载 `ESM` 格式,从而进行兼容的。
|
|
209
|
-
|
|
210
|
-
#### 参考链接
|
|
211
|
-
|
|
212
|
-
- [rollupjs](https://rollupjs.org/configuration-options/#output-format)
|
|
213
|
-
- [webpackjs](https://webpack.js.org/configuration/output/#module-definition-systems-1)
|
|
214
|
-
- [esbuild](https://esbuild.github.io/api/#format)
|
|
215
|
-
- [swc](https://swc.rs/docs/configuration/modules)
|
|
216
|
-
- [babel](https://babeljs.io/docs/babel-preset-env#modules)
|
|
217
|
-
- [typescript](https://www.typescriptlang.org/tsconfig/#module)
|
|
218
|
-
|
|
219
|
-
## 一些复用方式
|
|
220
|
-
|
|
221
|
-
### **利用路径 alias 复用代码**
|
|
222
|
-
|
|
223
|
-
在纯 JS 工程中,如果使用构建工具如 Vite / Webpack,可以配置别名路径:
|
|
224
|
-
|
|
225
|
-
```js
|
|
226
|
-
// vite.config.js
|
|
227
|
-
export default {
|
|
228
|
-
resolve: {
|
|
229
|
-
alias: {
|
|
230
|
-
'@utils': path.resolve(__dirname, 'src/utils')
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
然后在代码中:
|
|
237
|
-
|
|
238
|
-
```js
|
|
239
|
-
import { add } from '@utils/math.js'
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
但是这种方式,仅在构建工具中生效,假如一个项目不用任何的构建工具,这个方案就不行了。
|
|
243
|
-
|
|
244
|
-
### **发布为 npm 本地包 / 私有包 / 公共包**
|
|
245
|
-
|
|
246
|
-
绝大部的场景都应该使用这个方案,来达到跨项目复用代码的目的。
|
|
247
|
-
|
|
248
|
-
这也是官方和社区推荐的方案。
|
|
249
|
-
|
|
250
|
-
接下来让我们开始 `npm` 包发布的旅程吧!
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
# 从 0 到 1 构建 monorepo
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
# js 文件的各种后缀
|
|
2
|
-
|
|
3
|
-
下面用一张“速查表”+要点说明,把这些扩展名分别讲清楚,并说明各自**在什么情况下会被当作可执行模块加载**,以及**谁来消费它**。
|
|
4
|
-
|
|
5
|
-
## 速查表
|
|
6
|
-
|
|
7
|
-
| 扩展名 | 语义 | 由谁执行/消费 | 何时被当作“可运行的模块”加载 |
|
|
8
|
-
| ------- | -------------------------------------------------- | ---------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
9
|
-
| `.js` | JavaScript 源码(CJS 或 ESM,取决于上下文) | Node、浏览器、打包器 | **Node**:受 `package.json` 的 `"type"` 影响——`"type":"module"` 时按 **ESM** 解析,否则按 **CommonJS**。**浏览器**:始终当作 JS,是否是模块取决于 `<script type="module">`(ESM)还是普通 `<script>`(经典脚本)。 |
|
|
10
|
-
| `.cjs` | JavaScript(**强制 CommonJS**) | Node、打包器 | **Node**:始终按 **CommonJS** 加载,与 `package.json` 的 `"type"` 无关。 |
|
|
11
|
-
| `.mjs` | JavaScript(**强制 ESM**) | Node、浏览器、打包器 | **Node**:始终按 **ESM** 加载。**浏览器**:当作普通 JS 文件;是否作为模块取决于 `<script type="module">`。 |
|
|
12
|
-
| `.ts` | TypeScript 源码(模块语义由编译目标/解析策略决定) | **TS 编译器/工具链**(tsc、ts-node、tsx、Vite 等) | 不是原生可执行;需经编译或运行时加载器将其转成 `.js`。在 TS 的 `moduleResolution`=NodeNext/Node16 下,`.ts` 的产物会遵循对应的 CJS/ESM 规则。 |
|
|
13
|
-
| `.cts` | TypeScript,**指定生成 CommonJS** | TS 编译器/工具链 | 同上;不由 Node 直接执行。编译后产出 `.cjs/.js`(CJS 语义),并可生成 `.d.cts`。 |
|
|
14
|
-
| `.mts` | TypeScript,**指定生成 ESM** | TS 编译器/工具链 | 同上;不由 Node 直接执行。编译后产出 `.mjs/.js`(ESM 语义),并可生成 `.d.mts`。 |
|
|
15
|
-
| `.d.ts` | **类型声明文件**(仅类型,无运行时) | TypeScript 编译器、编辑器/语言服务、打包器的类型阶段 | **永不执行**。仅在类型检查/智能提示/发布类型时被“读取”。若包的 `package.json` 有 `"types": "index.d.ts"`(或在 `exports` 的 `types`/ `typesVersions` 配置),TS 会用它做类型来源。也存在 `.d.mts` / `.d.cts` 变体以对应 ESM/CJS。 |
|
|
16
|
-
|
|
17
|
-
# 关键规则与细节
|
|
18
|
-
|
|
19
|
-
1. **Node.js 如何决定 CJS vs ESM(针对 `.js`)**
|
|
20
|
-
- 在某个包目录(有 `package.json`)下:
|
|
21
|
-
- `package.json` 有 `"type": "module"` → 该目录内的 **`.js`** 默认视作 **ESM**。
|
|
22
|
-
- 否则(默认 `"type":"commonjs"`)→ **`.js`** 默认视作 **CommonJS**。
|
|
23
|
-
|
|
24
|
-
- **`.mjs` 一律 ESM,`.cjs` 一律 CJS**,不受 `"type"` 影响。
|
|
25
|
-
- 混合项目的常见做法:`"type":"module"` + 把需要 CJS 的文件命名为 `.cjs`;或反之。
|
|
26
|
-
|
|
27
|
-
2. **浏览器如何加载**
|
|
28
|
-
- 浏览器不关心 `.mjs/.cjs` 这些“Node 语义”扩展名本身;它看的是 `<script>` 标签:
|
|
29
|
-
- `<script type="module" src="...">` → ESM 模式(支持 `import`)。
|
|
30
|
-
- `<script src="...">` → 经典脚本(全局作用域,无模块语义)。
|
|
31
|
-
|
|
32
|
-
- 资源的 **MIME 类型** 需正确(如 `text/javascript`);文件扩展名不是决定性因素。
|
|
33
|
-
|
|
34
|
-
3. **TypeScript 文件(`.ts/.mts/.cts`)何时“会被加载”?**
|
|
35
|
-
- **Node 原生不会执行 TS**。你需要:
|
|
36
|
-
- 先用 **`tsc`** 编译为 `.js/.mjs/.cjs` 再由 Node 加载;或
|
|
37
|
-
- 使用运行时加载器/执行器(如 **ts-node、tsx、Bun** 或打包器 dev server)在内存里**即时转译**后再交给 JS 运行时执行。
|
|
38
|
-
|
|
39
|
-
- **`.mts` / `.cts` 的意义**:在 TS 4.7+ 的 `moduleResolution: "NodeNext"/"Node16"` 下,明确告知“这是要编译成 ESM/CJS 的 TS 文件”。这能避免仅用 `.ts` 时的二义性。
|
|
40
|
-
- 生成声明文件时会对应地产生 `.d.mts` / `.d.cts`。
|
|
41
|
-
|
|
42
|
-
4. **`.d.ts`(与 `.d.mts/.d.cts`)何时被“读取”**
|
|
43
|
-
- **只在类型系统中使用**:编译(`tsc`)、编辑器智能提示、类型检查、`npm publish` 时作为类型入口。
|
|
44
|
-
- 定位方式:
|
|
45
|
-
- 包内 `package.json` 的 `"types"` / `"typings"` 字段;
|
|
46
|
-
- `exports` 的 `types`(或 `typesVersions`);
|
|
47
|
-
- `typeRoots`、`types`、三斜线指令 `/// <reference types="...">`;
|
|
48
|
-
- `@types/*` 包(DefinitelyTyped)。
|
|
49
|
-
|
|
50
|
-
- **运行时绝不加载/执行**。
|
|
51
|
-
|
|
52
|
-
5. **打包器(Vite、Webpack、Rollup、esbuild)**
|
|
53
|
-
- 都把 **`.mjs` 当 ESM**、**`.cjs` 当 CJS**。
|
|
54
|
-
- 会通过插件/内置加载 TS(把 `.ts/.mts/.cts` 转成 JS)。
|
|
55
|
-
- 会遵守 `exports`/`module`/`main`/`type` 等字段来选择入口与格式。
|
|
56
|
-
- 对于 Node 产物,常见是同时发布 ESM 与 CJS 两套构建(双包架构),并提供相应的 `.d.ts`。
|
|
57
|
-
|
|
58
|
-
## 示例
|
|
59
|
-
|
|
60
|
-
**Node + `"type":"module"` 情况:**
|
|
61
|
-
|
|
62
|
-
```txt
|
|
63
|
-
pkg/
|
|
64
|
-
package.json // { "type": "module" }
|
|
65
|
-
index.js // 按 ESM 解析
|
|
66
|
-
legacy.cjs // 按 CJS 解析
|
|
67
|
-
util.mjs // 按 ESM 解析
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
**TypeScript 在 NodeNext 下的布局:**
|
|
71
|
-
|
|
72
|
-
```txt
|
|
73
|
-
src/
|
|
74
|
-
index.mts // 编译为 ESM(.mjs);会配套生成 index.d.mts(若开启声明)
|
|
75
|
-
loader.cts // 编译为 CJS(.cjs);会配套生成 loader.d.cts
|
|
76
|
-
types.d.ts // 仅类型,运行时不参与
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
**浏览器:**
|
|
80
|
-
|
|
81
|
-
```html
|
|
82
|
-
<!-- 经典脚本(非模块) -->
|
|
83
|
-
<script src="/app.js"></script>
|
|
84
|
-
|
|
85
|
-
<!-- ESM 模块 -->
|
|
86
|
-
<script type="module" src="/main.js"></script>
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## 实战建议
|
|
90
|
-
|
|
91
|
-
- **库作者**:建议产出 **双格式**(CJS+ESM)与**类型声明**,并在 `package.json` 设置:
|
|
92
|
-
- `"type": "module"`(若以 ESM 为主),再提供 CJS 入口(`.cjs`);
|
|
93
|
-
- 使用 `exports` 指定 `import`/`require` 条目与 `types`。
|
|
94
|
-
|
|
95
|
-
- **应用作者**:统一风格更省心。若全量 ESM,就:
|
|
96
|
-
- `"type":"module"` + 统一 `.js/.mjs`(或 TS 中用 `.mts`);
|
|
97
|
-
- 依赖里若有 CJS 包,让打包器或 Node 的兼容层处理。
|
|
98
|
-
|
|
99
|
-
- **TS 工程**:用 **`moduleResolution: "NodeNext"`**,并用 `.mts/.cts` 明确产物语义;发布时别忘了 `.d.ts`/`.d.mts/.d.cts`。
|