npm create vite 是如何实现的

文章类型:Vue

发布者:admin

发布时间:2023-06-28

创建一个vite项目,不需要全局安装脚手架,只需要一个命令npm create vite,就可以实现,那怎么实现的呢

一:流程

1:输入npm create vite会进入了一个终端问卷环节,输入项目名称、选择框架、语言等分支后,模板项目就创建好了

✔ Project name: … vite-project
✔ Select a framework: › Vue
✔ Select a variant: › TypeScript

Scaffolding project in vite-project...

Done. Now run:

  cd vite-project
  npm install
  npm run dev

二:实现方式

1:首先从npm init开始 ,npm CLI 的文档中,能够找到 npm init 命令,create 则是 init 的一个别名。

npm init foo --> npm exec create-foo

npm init @user/foo --> npm exec @user/create-foo

意味着,执行了 npm init vite 命令,它会在本地寻找或者去远程下载一个名为 create-vite 的 npm 包,exec 命令会从其 package.json 文件中寻找 bin 字段,执行对应的二进制或者 js 文件

create-vite
├─dist
|  └index.mjs
├─template-vue-ts
├─template-vue
├─template-vanilla-ts
├─template-vanilla
├─template-svelte-ts
├─template-svelte
├─template-react-ts
├─template-react
├─template-preact-ts
├─template-preact
├─template-lit-ts
├─template-lit
├─index.js
├─package.json
|...

A:首先进行 npm create vite===npm init vite

B:然后本地寻找或者去远程下载create-vite这个包

C:然后执行对应的文件


2:create-vite处理,分为四个步骤

A、获取终端可选参数:项目名称、模板名称

B、使用 prompts 工具创建问卷,包含多个题目和单选分支,轻量级的创建终端问卷的工具,支持文本、数字、密码、单选、多选等多种类型的题目

C、根据问卷结果,匹配对应的模板文件夹

D、拷贝模板到本地仓库,进行重置项目名称等后处理操作

3:所用工具

1:prompts ,一个轻量级的创建终端问卷的工具,支持文本、数字、密码、单选、多选等多种类型的题目

{
  type: 'select',
  name: 'framework',
  message: '请选择一个框架',
  choices: [
    {
      title: 'React',
      description: 'The library for web and native user interfaces',
      value: 'react'
    },
    {
      title: 'Vue',
      description: '渐进式 JavaScript 框架',
      value: 'vue'
    }
  ],
  initial: 1
}

2: kolorist,给终端加点颜色

const red = (str) => {
  const open = '\x1b[31m'
  const close = '\x1b[0m'
  return open + str + close
}
console.log(red('这里是红色的字体'))

3: unbuild 构建项目,一个基于 Rollup 的构建工具,配置简单,默认支持ts,构建速度快,内置了一个基于 esbuild 的轻量级的 file-to-file 工具 mkdist,能够在保持目录结构的情况下快速迁移文件夹

// create-vite/build.config.ts
export default {
  entries: ['src/index'], // 入口文件
  clean: true,
  // 支持 Rollup 相关配置
  rollup: {
    inlineDependencies: true,
    esbuild: {
      minify: true,
    },
  }
}