这是一个 node.js 的项目创建脚手架,用于创建次世代的 TypeScript 项目模板。
本项目主要针对 node.js 的后端项目环境或独立库开发,不针对前端创建项目,因为 vite webpack 已经有很多比较好的脚手架了)。
该项目将自动创建基础的 TypeScript 项目环境,并可通过参数增加部分相关库:
typescript@^4.6.2
@types/node@^16
该项目只保持对 node.js LTS 版本对齐,不考虑兼容更早的 node.js 版本。--eslint|-e false
控制,默认开启。推荐阅读:https://typescript-eslint.io/
eslint@^8
@typescript-eslint/parser@^5
@typescript-eslint/eslint-plugin@^5
--lib ts-node
添加。
ts-node@^10.4.0
--lib swc
添加。
chokidar^@3.5.3
,要以 watch 模式执行 swc 编译,需要增加这个库@swc/cli@^0.1.55
@swc/core@^1.2.151
regenerator-runtime@^0.13.9
--lib mocha
添加,默认整合 mocha 和 chai。
mocha@^9.2.1
@types/mocha@^9.1.1
chai@^4.3.6
@types/chai@^4.3.0
现阶段 ts-node
x swc
,构成了完美的 TypeScript 的本地开发环境,而且开发时完全可以用 ts-node
x swc
直接解释执行,而无需编译。
当通过参数添加了相关库以后,除了在创建项目时自动创建 package.json
文件,相关的 tsconfig.json
.swcrc
.mocharc.json
.gitignore
.eslintrc.js
也会根据参数自动添加。
npx create-ts-next <name>
# 使用帮助和查看版本号
npx create-ts-next --help
npx create-ts-next --version
# 更新新版本
# 如果之前通过 npx 指令使用过
npx create-ts-next@latest --help
# typescript, eslint, ts-node, swc
npx create-ts-next <name> -l all -p pnpm -i
# typescript, ts-node, swc, mocha
npx create-ts-next <name> --eslint false -l all -M
指定 module 模式,默认 commonjs
。
TS 编译目标,默认 ES2019
nodejs@16.0.0
是否开启 eslint ,默认开启。
如果开启,则自动添加相关依赖库,并在新建项目中添加基础 .eslintrc.js
文件。
附加库,可选值 ts-node|swc|mocha|prettier|all
,可多项。
如果添加相关库,则会在新建的项目中添加相关的文件:
tsconfig.json
文件,会增加 "ts-node": {}
字段。.swcrc
文件。
ts-node
则在 tsconfig.json
文件,增加 "ts-node": { "swc": true }
字段。.mocharc.json
文件.prettierrc
文件启用 mock 模式,该模式不会检查是否存在重名目录,也不会创建任何目录和文件,只是模拟正常执行的流程。
是否开启 引用 helpers 模式 ,默认开启。
--import-helpers
,将自动添加 tslib
swc
,也会添加 @swc/helper
默认为 npm
,可选 npm
yarn
pnpm
,选择本地 node 包管理器。
默认为 true
是否自动安装依赖包,根据指定的 --package-manager|-p
安装项目依赖。
create-ts-next
亦可作为一个编程库而被使用,如:create-webpack-next
ProjectCreator 提供了创建 node.js 模板项目的抽象类。
Options
和 State
,class YourCreator extends ProjectCreator<YourOptions, YourState>
Options
为藉由外部环境(如
CLI)传入的配置选项,要求限定继承自 ProjectCreatorBasicOptions
State
藉由配置选项,生成的运行时状态,如果无,可指定一个任意的结构。getStructure(): ProjectStructure
和 startUp(): Promise<this>
getStructure(): ProjectStructure
获取需要创建的项目的目录结构startUp(): Promise<this>
启动执行创建项目getTemplatePath(relative: string): string
方法,根据相对路径返回对应的模板所在路径。
relative
为相对于项目根目录的相对路径,如:
/my-app
,处理创建文件 /my-app/src/index.ts
,则此时的 relative
为 src/index.ts
await this.detectPackageCmd();
检查本地可使用的 package manager 指令,如果你需要 install 的话this.create(this.getStructure());
传入创建项目的结构,并创建项目await installDeps(this.projectRoot, this.packageCmd);
安装依赖,如果你需要 install 的话installDeps 同样由 create-ts-next 提供,
import { installDeps } from 'create-ts-next'
用于描述创建项目的基本配置选项。
interface ProjectCreatorBasicOptions {
// 创建的项目名称
name: string,
// 是否要 install
install: boolean,
// 指定的包管理器
packageManager: 'npm' | 'yarn' | 'pnpm',
// 是否启用调试
debug?: boolean,
// 是否启用模拟模式
mock?: boolean,
}
用于描述项目的目录结构,可以将一个 ProjectStructure 数据实体,理解为对应的一个目录或文件的描述,其结构声明如下:
type ProjectStructure = {
// 文件或目录名称
name: string,
// 是一个文件还是目录,undeinfed 时默认为 file
type?: 'dir' | 'file',
// 仅对 type = file 有效,文件的数据内容文本格式
data?: string,
// 忽略 ejs 模板处理
// ignoreTpl = true 时,仍旧会尝试去加载模板内容,但不会进行 ejs 模板处理
ignoreTpl?: boolean,
// 目录下的内容,仅对 type = dir 有效
children?: (ProjectStructure | undefined)[]
}
描述了一个库所依赖的包及其版本号。其结构声明如下:
type DependenciesItem = Record<string, string>
export type DependenciesDef = {
dependencies?: DependenciesItem,
devDependencies?: DependenciesItem,
}
// 举个🌰:声明 TypeScript 所依赖的包
const TypeScriptDeps: DependenciesDef = {
dependencies : {
'tslib': '^2.3.1'
},
devDependencies: {
'@types/node': '^16',
'typescript' : '^4.6.2',
}
}
这里库是一个抽象名词,比如我们需要在项目中添加 TypeScript :
typescript
这个依赖包,@types/node
这个辅助库,以及 tslib
这个运行时依赖包。ts-loader
/ babel-loader
/ swc-loader
等等,基于此,可能还有更多的依赖包,诸如 @babel/preset-env
/ @babel/preset-typescript
等等。合并两个依赖声明,仅对 dependencies
和 devDependencies
字段进行合并。
dependenciesMerge(deps1: DependenciesDef = {}, deps2: DependenciesDef = {}): DependenciesDef | undefined
根据 package.json 安装依赖包。
installDeps(dir: string, cmd: PackageCmd): Promise<void>
dir
: 执行安装的目录,最好为绝对路径。cmd
: 执行的包管理器命令。根据执行指令的返回代码(child process exit code)来判定执行状态。
ts-vars.ts 提供 TypeScript Module 和 Target 的枚举与 alias,如果有需要,请按需引用。
package.json
添加 script
{
"scripts": {
"dev:nodemon": "nodemon"
}
}
项目根目录添加 nodemon.json
{
"watch": ["src"],
"ext": "ts,json",
"ignore": ["src/**/*.spec.ts"],
"exec": "ts-node ./src/index.ts"
}
ejs^3
, mocha^10
typescript^5
, 及其他prettier
nodemon
替换 chokidar
库ProjectCreator.generateFileContent
方法,使继承类可使用自定义的模板处理器。ProjectCreator.getTemplatePath
方法--package-manager|-p
选择本地 node 包管理器,默认为 npm
;src/index.ts
(对应 dist/index.js
)导出全部代码,增加 src/cli.ts
作为脚本启动环境(便于可复用代码);ProjectCreator
和 TsNextProjectCreator
。--install|-i
控制创建项目后,是否自动安装依赖包;scripts
,增加 dev:start
build
lint
(如果包含 eslint) test
(如果包含 mocha)。此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。