Skip to content
快速预览

项目搭建工具

✍️ w 🕒 2023-09-28 06:18:45(8 months ago) 🔗 H.各种练习项目

一般我们会通过webpack构建项目但是,能每一个项目从头来完成所有的webpack配置,这样显示开发的效率会大大的降低,常会使用脚手架来创建一个项目,帮助我们搭建项目的工具(会构建 项目基本目录解构,基本配置,基本使用的包等),随着前端的发展现在打包工具除了webpack 有了更多的其他选择

搭建 VUE 项目这类脚手架选择的工具有两种 VITE 或者 vue/cli 两种方案

使用 vue/cli

Vue CLI,CLICommand-Line Interface, 翻译为命令行界面,通过CLI选择项目的配置和创建出我们的项目Vue CLI已经内置了webpack相关的配置,我们不需要从零来配置

  • 安装
npm install @vue/cli -g
  • 临时安装
npx @vue/cli ui
  • 使用
Vue create 项目的名称

或者

Vue ui
  • 创建过程的一些选择如图

项目目录

bash
|-- README.md  # 项目的文档。它可以包含有关项目的信息,包括目的、安装说明、使用指南和其他相关细节。
| -- .browserslistrc  # 用于定义目标浏览器及其版本,以确保项目与特定浏览器版本兼容。在Web开发中,通常使用它配置Autoprefixer和Babel等工具,以确保生成的代码与特定的浏览器版本兼容。
|-- babel.config.js   # Babel是一个JavaScript编译器。Babel允许你编写现代的JavaScript代码,并将其转译为向后兼容的版本,以在旧版浏览器或环境中运行 
|-- jsconfig.json # 用于JavaScript项目,它使用Visual Studio Code(VS Code)编辑器。它提供了编辑器的配置设置
|-- package-lock.json # 当在项目中安装或更新包时会自动生成这个文件。它确保安装的包在不同环境中保持一致,通过锁定它们的版本
|-- package.json #  它包含了关于项目的元数据,比如名称、版本、依赖项、脚本和其他配置设置
|-- public     # 这个目录包含作为项目中静态文件提供的公共资源。在这种情况下,它包括favicon.ico文件(在浏览器选项卡中显示的图标)和index.html文件,它作为Web应用程序的入口点
|   |-- favicon.ico
|   `-- index.html
|-- src        # 这个目录包含项目的源代码
|   |-- App.vue
|   |-- assets
|   |   `-- logo.png
|   |-- components
|   |   `-- HelloWorld.vue
|   `-- main.js
`-- vue.config.js # 这个文件是用于配置Vue CLI的配置文件。Vue CLI是一个用于快速搭建Vue.js项目的命令行工具,vue.config.js文件可以设置项目的各种构建和开发配置选项。

对 jsconfig.json 说明

上面的项目没有使用 ts 使用了js,但有时候也期望 js 可以做到一些 想ts 的提醒和检测功能 这时候需要目录中jsconfig.json文件

表示改目录是JavaScript项目的根目录。jsconfig.json的配置可以对你的文件所在目录下的所有js代码做出个性化支持。jsconfig.json是tsconfig.json的子集。

  • 文件范围 - 没有jsconfig.json:在此模式下,在Visual Studio Code中打开的JavaScript文件被视为独立单元。 只要文件a.js没有显式引用文件b.ts(使用///引用指令或CommonJS模块),两个文件之间就没有共同的项目上下文。
  • 显式项目 - 使用jsconfig.json:JavaScript项目是通过jsconfig.json文件定义的。 目录中存在此类文件表示该目录是JavaScript项目的根目录。 文件本身可以选择列出属于项目的文件,要从项目中排除的文件,以及编译器选项(见下文)

在当我们用打包工具时候设置了路径别名,也可通过配置 jsconfig.json 帮助我们去做到路径提醒

js
{
  "compilerOptions": {
    "target""esnext",
    "checkJs"true,
    "baseUrl"".",
		// 配置路径别名 
    "paths": {
      "~/*": ["./node_modules/*"],
      "@/*": ["./src/*"],
      "api/*": ["./src/api/*"],
      "common/*": ["./src/common/*"],
      "components/*": ["./src/components/*"],
      "config/*": ["./src/config/*"],
      "extend/*": ["./src/extend/*"],
      "locale/*": ["./src/locale/*"],
      "router/*": ["./src/router/*"],
      "store/*": ["./src/store/*"],
      "assets/*": ["./src/assets/*"],
      "views/*": ["./src/views/*"],
    }
  },
  "exclude": ["node_modules""public""dist"],
}

在工作空间中定一个jsconfig.json文件时,JavaScript体验会得到改进。

使用VITE

vite版本 也提供了 vue 创建工程化的方式

安装指令

bash
npm init vue@latest`

等同执行指令

bash
npx create-vue@next

额外知识补充:npm init 用来初始化我们本地项目的 package.json,然后根据提示,输入项目名,作者名等配置。还可以使用 npm init -y 来实现跳过手动配置,但如果指定了模板了可直接将网络模板下载下来。以上面的命令为例实际npm init vue@latest,等同执行了 npx create-vue@next,通过ViteJs 源码的 packages 文件夹中 create-app 目录可以找到这些工程模板 具体原理 可以参考1 参考2

  • 创建过程的一些选择如图
js
Project name项目名): toolsdog
Add TypeScript添加TS? : No
Add JSX Support添加JSX支持? : No
Add Vue Router for Single Page Application development添加Vue-router? : Yes
Add Pinia for state management添加状态管理Pinia? : Yes
Add Vitest for Unit testing为单元测试添加Vitest? : No
Add Cypress for both Unit and End-to-End testing为单元测试与端到端测试添加Cypress? : No
Add ESLint for code quality为代码质量添加ESLint? : Yes
Add Prettier for code formatting为代码格式添加Prettier? : Yes

Scaffolding project in ./tooldog...
Done.

项目目录

以上面配置的为例生成的项目目录进行一个文件介绍

bash
.
|-- README.md # 项目的说明文档,通常包含项目的介绍、安装和使用方法等信息。
|-- env.d.ts # TypeScript类型定义文件,用于声明全局环境变量的类型。
|-- index.html # 项目的入口HTML文件,通常包含加载项目所需的脚本和样式等
|-- package.json # 项目的配置文件,包含了项目的依赖和脚本等信息
|-- public
|   `-- favicon.ico
|-- src
|   |-- App.vue
|   |-- assets
|   |   |-- base.css
|   |   |-- logo.svg
|   |   `-- main.css
|   |-- components
|   |   |-- HelloWorld.vue
|   |   |-- TheWelcome.vue
|   |   |-- WelcomeItem.vue
|   |   |-- __tests__
|   |   |   `-- HelloWorld.spec.ts
|   |   `-- icons
|   |       |-- IconCommunity.vue
|   |       |-- IconDocumentation.vue
|   |       |-- IconEcosystem.vue
|   |       |-- IconSupport.vue
|   |       `-- IconTooling.vue
|   |-- main.ts
|   |-- router
|   |   `-- index.ts
|   |-- stores
|   |   `-- counter.ts
|   `-- views
|       |-- AboutView.vue
|       `-- HomeView.vue
|-- tsconfig.app.json # 页面开发的ts 配置项
|-- tsconfig.json # ts 所有配置项的入口
|-- tsconfig.node.json # 运行在node 环境中的 ts 配置项
|-- tsconfig.vitest.json # vitest 需要的 ts 配置项
|-- vite.config.ts #  Vite配置文件,用于构建工具Vite的配置。
|-- vitest.config.ts # Vite测试配置文件,用于构建工具Vite的测试配置
`-- yarn.lock # Yarn的依赖版本锁定文件,用于确保每次安装的依赖版本一致。

项目中的tsconfig 配置文件

补充说明 tsconfig.app.json tsconfig.json tsconfig.node.json tsconfig.vitest.json 四个文件

上面 vite 搭建的 Vue 的项目为例其实app src 中的一些ts 配置例如 dom 的配置基本是不会再 vite.config 中使用到的,一个项目其实除了业务如果细分他是多维度构成,之前将多维的配置都集成在一个文件内做法,如果使用多个 tsconfig 文件来解决其中一些问题,但是会出现新的问题: 就是需要启动多个入口的配置,并不能统一处理

在 TypeScript 3.0中的一个新特性,它允许您将 TypeScript 程序结构化为更小的部分。来解决这个问题 references 字段,可以将多个配置都集中起来在对外暴露出去一个入口

  • tsconfig.json 作为其他配置的总入口,将其他配置导入到这个入口中
js
{
	// "files" 字段为空数组。该字段用于指定要包含在 TypeScript 项目中进行编译的文件列表。通过将文件路径添加到 "files" 字段中,可以告诉 //
	// TypeScript 编译器只对指定的文件进行编译,而不是整个项目目录。如果 "files" 字段为空数组,则表示不指定特定的文件,编译器将默认编译项目中
	// 的所有 TypeScript 文件
  "files": [], 
  "references": [
    {
      "path": "./tsconfig.node.json"
    },
    {
      "path": "./tsconfig.app.json"
    },
    {
      "path": "./tsconfig.vitest.json"
    }
  ]
}
  • tsconfig.app.json 将一些关于 页面开发的ts 配置都集中的文件
js
{
	// 指定要扩展的基础 TypeScript 配置文件。在此示例中,它扩展了 @vue/tsconfig/tsconfig.dom.json,表示它基于该文件进行配置。
  "extends": "@vue/tsconfig/tsconfig.dom.json", 
	// 指定要包括在编译中的文件或文件夹的匹配模式。在此示例中,它包括了 env.d.ts、src/**/* 和 src/**/*.vue,表示这些文件和文件夹中的 TypeScript 代码将被编译
  "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
	// 指定要排除在编译之外的文件或文件夹的匹配模式。在此示例中,它排除了 src/**/__tests__/*,表示这些文件夹中的测试代码将不会被编译。
  "exclude": ["src/**/__tests__/*"],
  "compilerOptions": {
    "composite": true, // 设置为 true,表示启用项目的组合编译。组合编译允许将多个项目组合成一个,以提高构建性能
    "baseUrl": ".", // 指定相对路径解析的基础目录。在此示例中,它设置为当前目录(".")
    "paths": {
      "@/*": ["./src/*"] // 指定模块名称的映射到实际文件或文件夹的路径。在此示例中,它将 @/* 映射到 ./src/*,表示在代码中使用 @/ 引用时,将从 src/ 目录下查找相应的模块 帮助编辑
    }
  }
}
  • tsconfig.node.json 将一些 配置的ts 文件集中
js
{
	// 指定要扩展的基础 TypeScript 配置文件。在此示例中,它扩展了 @tsconfig/node18/tsconfig.json,表示它基于该文件进行配置。
  "extends": "@tsconfig/node18/tsconfig.json",
	// 指定要包括在编译中的文件或文件夹的匹配模式。在此示例中,它包括了一系列文件,如 vite.config.*、vitest.config.*、cypress.config.*、nightwatch.conf.* 和 playwright.config.*。这些文件将被包含在编译中
  "include": [
    "vite.config.*",
    "vitest.config.*",
    "cypress.config.*",
    "nightwatch.conf.*",
    "playwright.config.*"
  ],
  "compilerOptions": {
    "composite": true, // 设置为 true,表示启用项目的组合编译。与前一个示例相同,这允许将多个项目组合成一个,以提高构建性能。
    "module": "ESNext", // 指定生成的 JavaScript 模块的模块系统。在此示例中,它设置为 "ESNext",表示使用 ES 模块系统
    "moduleResolution": "Bundler", // 指定模块解析的策略。在此示例中,它设置为 "Bundler",表示使用打包工具进行模块解析。
    "types": ["node"] // 指定要包含的类型声明文件。在此示例中,它包括了 "node",表示项目将使用 Node.js 类型声明。
  }
}
  • tsconfig.vitest.json 将一些 vitest 的单测配置
js
{
  "extends": "./tsconfig.app.json", // extends:指定要扩展的基础 TypeScript 配置文件。在此示例中,它扩展了当前目录下的 tsconfig.app.json 文件,表示它基于该文件进行配置。
  "exclude": [], // 指定要排除在编译之外的文件或文件夹的匹配模式。在此示例中,它为空数组,表示没有要排除的文件或文件夹。
  "compilerOptions": {
    "composite": true, // 设置为 true,表示启用项目的组合编译。与前面的示例相同,这允许将多个项目组合成一个,以提高构建性能。
    "lib": [], // 指定要包含的库文件。在此示例中,它为空数组,表示不包含任何默认库文件。您可以根据项目的需求添加所需的库文件。
    "types": ["node", "jsdom"] // 指定要包含的类型声明文件。在此示例中,它包括了 "node" 和 "jsdom",表示项目将使用 Node.js 和 JSDOM 的类型声明。
  }
}

整套配置文件可以看作,App跑的环境(就是src文件夹里面的),目地是在浏览器中运行的 和 Vite本身,包括它的配置文件是运行在你计算机内的Node环境

  • 这里对 typesinclude 字段说明

includetypes 都是 TypeScript 配置文件 (tsconfig.json) 中的选项,但它们有不同的用途和行为。以下是这两个选项的主要区别:

  1. include:

    • 用途:定义了 TypeScript 编译器应该包括哪些文件进行编译。
    • :它接受一个文件和目录的列表,可以使用 glob 模式。例如:["src/**/*", "tests/**/*.ts"]
    • 行为:指定了哪些文件应该被 TypeScript 编译器考虑。如果文件不在这个列表中,它将不会被编译(除非它是由其他被包括的文件引用的)。
  2. types:

    • 用途:指定应该包含哪些类型声明文件或 @types 包,在 node_modules/types
    • :它接受一个类型声明包的列表。例如:["node", "lodash"]
    • 行为:当您设置了 types 选项,只有指定的类型声明文件会被 TypeScript 考虑。这意味着,如果您有其他的 @types 包安装在 node_modules/@types 目录下,但它们没有在 types 列表中,那么它们将不会被加载。

总结:

  • include 控制哪些源文件应该被编译。
  • types 控制哪些类型声明文件应该被加载。

项目中的env.d.ts

env.d.ts 文件 作为TypeScript类型定义文件,用于声明全局环境变量的类型。 以vite项目为例他的 tsconfig.app.json 文件中 "include": ["env.d.ts", "src/**/*", "src/**/*.vue"] 字段明确将要 ts 在编译的文件列出因此 env.d.ts 会被解析

需要先了解ts reference 指令:使用 reference 指令时,它会将整个类型声明文件的内容导入到当前文件中。这意味着在当前文件中,您可以使用类型声明文件中定义的所有类型、接口、函数等。这种方式适用于旧版本的 TypeScript 或需要一次性导入所有类型声明的情况。

点击进入后可以发现 文件内部写法

ts
/// <reference types="vite/client" />

这个作用是需要先从一个例子说,正常来说 ts 是不识别 css 这种后缀文件的,需要做 这类文件的声明文件,才能让ts 在开发过程中有提示帮助到我们。这种统一需要大量配置的 在 "vite/client" 文件已经帮助配置好了,我们导入即可

但 "vite/client" 并没有提供 vue 的声明,可在开发中vue 文件没有产生声明报错,使用vscode 安装的 TypeScript Vue Plugin (Volar) 帮我们识别了 vue 文件的类型声明,实际上应该自己配置,配置后的效果

ts
/// <reference types="vite/client" />

// 上面是三斜线指令,用于告诉编译器在编译的过程中要引用额外的文件
// 如果是types属性,则用于声明对另一个库的依赖,如上面,则是对vite这个库下的cliend.d.ts的引用,具体可见node_modules
// 如果是path属性,则用于声明对另一个文件的依赖
// 因为这是一个全局的声明文件,所以使用了三斜线指令,如果用了import,则文件就会变成了模块声明文件了
// 下面的意思是是,全局定义一个模块,当import xxx from 'xx.vue';的方式引入模板文件的时候,编译器不会报错
// 且引入的类型是DefineComponent类型

declare module '*.vue' {
  import { DefineComponent } from 'vue' // 在早期没有 setup 写法时候我们都需要将组件包裹 DefineComponent 这其实就是vue的类型声明,从vue 中导入获取类型
  const component: DefineComponent // 定义 component 组件的声明类型
  export default component // 导出使用
}

甚至在使用第三方库的时候,全局导入 组件后 发现组件没有了类型声明,其实也可以从中解决以 antVue 为例导入所有组件的声明

js
/// <reference types="ant-design-vue/typing/global.d.ts" />

参考

探究 tsconfig.node.json 文件和 references 字段的作用

npm init @vitejs/app 到底干了什么

VScode的jsconfig.json配置文件说明

VSCode使用jsconfig.json来支持webpack alias文件导入

你需要知道jsconfig.json 都在这里啦

Released under the MIT License.