vue3-quickstart-cli
Version:
一个用于快速创建 Vue3 项目的脚手架工具。
65 lines (62 loc) • 2.14 kB
JavaScript
import path from 'path';
import fs from 'fs-extra';
import chalk from 'chalk';
export default function genTypescript(targetDir, pkg) {
fs.writeFileSync(path.join(targetDir, 'tsconfig.json'), `{
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "Node",
"strict": true,
"jsx": "preserve",
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
},
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]
}
`);
// 健壮入口文件重命名逻辑:main.js/main.jsx/main.mjs/main.cjs/main.tsx -> main.ts
const srcDir = path.join(targetDir, 'src');
const candidates = [
'main.js', 'main.jsx', 'main.mjs', 'main.cjs', 'main.tsx'
];
let renamed = false;
for (const file of candidates) {
const filePath = path.join(srcDir, file);
const mainTs = path.join(srcDir, 'main.ts');
if (fs.existsSync(filePath)) {
fs.renameSync(filePath, mainTs);
renamed = true;
break;
}
}
// 如果没有 main.ts,给出友好提示
const mainTsPath = path.join(srcDir, 'main.ts');
if (!fs.existsSync(mainTsPath)) {
fs.writeFileSync(mainTsPath, `import { createApp } from 'vue';
import App from './App.vue';
import store from './store';
import router from './router';
const app = createApp(App);
app.use(store);
app.use(router);
app.mount('#app');
`);
console.log(chalk.yellow('未检测到入口文件,已自动生成 main.ts。'));
}
// App.vue script setup 改为 lang="ts"
const appVue = path.join(targetDir, 'src/App.vue');
if (fs.existsSync(appVue)) {
let appCode = fs.readFileSync(appVue, 'utf-8');
appCode = appCode.replace('<script setup>', '<script setup lang="ts">');
fs.writeFileSync(appVue, appCode, 'utf-8');
}
// 不要写 pkg.devDependencies['vue']
pkg.dependencies['vue'] = '^3.5.17';
console.log(chalk.green('已集成 TypeScript,入口文件为 main.ts!'));
}