1.Ts环境配置和搭建

120 阅读8分钟

一.环境配置

1.全局配置编译TS文件

npm install typescript -g

tsc --init # 生成tsconfig.json

tsc # 可以将ts文件编译成js文件

tsc --watch # 监控ts文件变化生成js文件

2.配置rollup环境

  • 安装依赖
cnpm install rollup typescript rollup-plugin-typescript2 @rollup/plugin-node-resolve rollup-plugin-serve -D
  • 初始化 ts 文件 npx ts --init
  • rollup配置文件
import serve from "rollup-plugin-serve"; //rollup插件 开发环境中提供静态文件服务器和自动刷新功能。
import ts from "rollup-plugin-typescript2"; //rollup 插件,用于将 TypeScript 代码编译为 JavaScript.
import { nodeResolve } from "@rollup/plugin-node-resolve"; // rollup 插件,用于解析模块依赖关系中的 Node.js 模块。
import path from 'path' //node 模块
// import { dirname } from 'path'
import { fileURLToPath } from 'url'
const __dirname = path.dirname(fileURLToPath(import.meta.url)) //import.meta.url 当前文件路径


export default {
  input: './src/index.ts', //打包入口
  output: {
    format: 'iife',// 打包的js 输出的格式
    file: path.resolve('dist/bunlde.js'),//文件输出地址
    sourcemap: true,//是否开启源文件映射 
  },
  plugins: [
    nodeResolve({
      extensions: ['.js', '.ts'] // // 指定扩展名
    }),
    ts({
      tsconfig: path.resolve(__dirname, 'tsconfig.json') //指定ts校验文件
    }),
    serve({
      open: true, //是否打开默认浏览器
      openPage: '/public/index.html', // 打开文件
      port: 3000, // 端口
      contentBase: '' // 根路径
    })
  ]
}

3.tsconfig文件配置项详解

{
	"compilerOptions": {
		// 编译配置项
		/* Visit https://aka.ms/tsconfig to read more about this file */
		/* Projects */
		/* 保存是否开启增量编译 提高编译速度和效率 */
		// "incremental": true,
		/* 
     是否启用组合项目 组合项目 将多个子项目组合在一起进行编译 通过启用这个组合式项目可以 实现夸项目的引用和管理 以及更高效的增量编译
     跨项目引用:在一个子项目中可以引用另一个子项目中的代码。
     增量编译:当一个子项目发生变化时,只会重新编译该子项目及其依赖的项目,而不需要重新编译整个项目。
     构建顺序优化:编译器可以根据项目间的依赖关系,确定最优的编译顺序,从而提高编译速度。
  */
		// "composite": true,
		/*
    通过这个选项来输出增量输出的文件路径 
    */
		// "tsBuildInfoFile": "./.tsbuildinfo",
		/*
    禁用项目引用的源文件重定向 
    禁用源文件重定向后,项目引用将直接引用源文件而不是输出文件。
    这可能会导致重复编译某些源文件,从而增加编译时间。
    个人 建议仅在特殊情况下需要直接引用源文件时才使用该选项
    */
		// "disableSourceOfProjectReferenceRedirect": true,
		// "disableSolutionSearching": true,                 /* Opt a project out of multi-project reference checking when editing. */
		/*
    是否禁止加载引用的项目
    禁用引用项目的加载后,编译器将不再加载和解析项目引用,并且仅考虑当前项目的源文件。
    这可能会导致缺少类型信息或构建依赖关系图的问题。
    因此,在使用该选项时,请确保不依赖于其他项目的类型定义和依赖关系。
    */
		// "disableReferencedProjectLoad": true,
		/* Language and Environment */
		/* 指定编译的目标es 版本*/
		"target": "es2016",
		/* 指定编译时用到的JavaScript库 
     "lib": [
      "es2016",
      "dom"
    ]
    */
		// "lib": [],
		/* jsx 处理方式.
    
    "preserve": 将 JSX 保持不变,不进行转换。
    "react-native": 将使用 React Native 运行的应
    */
		// "jsx": "preserve",
		/* 开启装饰器 */
		// "experimentalDecorators": true,
		/* 控制是否在编译结果中包含装饰器的元数据 */
		// "emitDecoratorMetadata": true,
		/* 指定用于创建 JSX 元素的工厂函数 react jsx 经常用*/
		// "jsxFactory": "",
		/* 指定用于创建 JSX 片段(JSX Fragments)的工厂函数 */
		// "jsxFragmentFactory": "",
		/* 导入 JSX 相关的辅助代码的模块路径 */
		// "jsxImportSource": "",
		/* 生成 JSX 元素和组件的命名空间。 
    "reactNamespace": "MyReact"
    */
		// "reactNamespace": "",
		/* 禁用默认的内置库声明。 */
		// "noLib": true,
		/* 类属性的定义是否应该使用 ECMAScript 中新引入的类字段语法。 
    constructor(x: number) {
    this.x = x;
    }
    foo = 'bar';
    #z = 42;
    */
		// "useDefineForClassFields": true,
		/* 指定模块的检测方式 */
		// "moduleDetection": "auto",
		/* Modules */
		/* 模块的输出方式。 */
		"module": "commonjs",
		// TypeScript 源代码的根目录
		// "rootDir": "./",
		// 指定模块解析策略
		// "moduleResolution": "node10",
		// 指定相对路径的基准目录。当使用相对路径引用模块时
		// "baseUrl": "./",
		// 配置模块名的映射路径。可以使用 "paths" 选项来定义模块名到具体文件路径的映射关系。
		// 这可以方便地解决模块引用时的路径问题。
		// 例如,
		// "@app/*": ["src/app/*"],
		// "@utils/*": ["src/utils/*"]
		// "paths": {},
		// 用于指定多个根目录
		// "rootDirs": [
		//   "path/to/dir1",
		//   "path/to/dir2",
		//   "path/to/dir3"
		// ]
		// "rootDirs": [],
		// 指定类型声明文件的根目录
		// "typeRoots": [
		//   "path/to/dir1",
		//   "path/to/dir2"
		// ]
		// "typeRoots": [],
		// 指定要包含的类型声明文件(Type Declaration Files)的列表。 外部的比如知道loadlish jquery
		// 如果是空数组 ts会去node_modules/@types 查找相关的ts 声明文件
		// "types": [],
		// 允许访问全局的 UMD 库
		// "allowUmdGlobalAccess": true,
		// 指定模块文件的后缀名列表。
		// "moduleSuffixes": [
		//   ".mjs",
		//   ".vue"
		// ]
		// "moduleSuffixes": [],
		// 允许在导入模块时使用 TypeScript 文件的扩展名(.ts 或 .tsx)
		// "allowImportingTsExtensions": true,
		// 解析 package.json 文件中的 "exports" 字段
		// "resolvePackageJsonExports": true 表示启用了解析 package.json 文件中的 "exports" 字段。
		// 这意味着 TypeScript 编译器将会按照 "exports" 字段的配置来解析和导入模块
		// "resolvePackageJsonExports": true,
		// 启用解析 package.json 文件中的 "imports" 字段。ts4.8版本以上
		// "resolvePackageJsonImports": true,
		// 自定义条件的数组选项。
		/*
    
     "customConditions": [
      {
        "match": "\\.spec\\.ts$",
        "action": "exclude"
      },
      {
        "match": "\\.mock\\.ts$",
        "action": "exclude"
      }
    ]

    第一个条件会排除所有以 ".spec.ts" 结尾的文件,第二个条件会排除所有以 ".mock.ts" 结尾的文件。这样,在编译过程中,这些文件将不会被包含在编译结果中。
    */
		// "customConditions": [],
		// 启用 JSON 模块解析的选项
		// "resolveJsonModule": true,
		// 允许导入任意扩展名的选项。
		// "allowArbitraryExtensions": true,
		// 用于禁用模块解析的选项。启用 "noResolve" 后,将无法使用 import 语句导入其他模块
		// "noResolve": true,

		/* JavaScript Support */
		// 允许导入 JavaScript 文件的选项。
		// "allowJs": true,
		// 用于检查 JavaScript 文件的选项
		// "checkJs": true,
		// 配置模块解析的层数
		// "maxNodeModuleJsDepth": 1,
		/* Emit */
		// 配置是否生成声明文件(.d.ts)
		// "declaration": true,
		// 生成声明文件映射(.d.ts.map)
		// "declarationMap": true,
		// 控制只生成声明文件而不生成编译后的 JavaScript 文件的选项
		// "emitDeclarationOnly": true,
		// 是否生成源映射文件(.js.map)
		// "sourceMap": true,
		// 是否将源映射文件(.js.map)内联到编译后的 JavaScript 代码中
		// "inlineSourceMap": true,
		// 指定编译后的 JavaScript 文件的输出位置。
		// "outFile": "./",
		// 指定编译后的 JavaScript 文件的输出目录。
		// "outDir": "./",
		// 编译过程中是否删除注释。
		// "removeComments": true,
		// 控制是否在编译过程中生成输出文件。
		// "noEmit": true,
		// 编译过程中引入辅助函数。
		// "importHelpers": true,
		// 控制在编译过程中如何处理没有被使用作为值的导入语句。
		// "importsNotUsedAsValues": "remove",
		// 控制编译过程中对迭代器和生成器的转译方式。
		// "downlevelIteration": true,
		// 设置生成的 JavaScript 代码中源文件(原始 TypeScript 文件)的根目录。
		// "sourceRoot": "",
		// 设置生成的 JavaScript 代码中源映射文件的根目录。
		// "mapRoot": "",
		// 生成的 JavaScript 代码中内联源代码的位置信息
		// "inlineSources": true,
		// 生成的文本文件开头会插入一个字节顺序标记 (BOM)。BOM 是一个特殊的 Unicode 字符(\uFEFF),用于指示文本文件的字符编码。它主要用于处理不同编码的文本文件之间的兼容性问题。
		// "emitBOM": true,
		// 当将 "newLine" 设置为 "crlf" 时,TypeScript 编译器会使用回车换行符 (\r\n) 作为生成的文件的换行符。这是一种常见的换行符格式,在许多操作系统和文本编辑器中被广泛使用。
		// "newLine": "crlf",
		// "stripInternal": true,
		// "noEmitHelpers": true,
		// "noEmitOnError": true,
		// "preserveConstEnums": true,
		// 该配置选项用于指定生成声明文件(.d.ts)的输出目录
		// "declarationDir": "./",
		// "preserveValueImports": true,

		/* Interop Constraints */
		// "isolatedModules": true,
		// "verbatimModuleSyntax": true,
		// "allowSyntheticDefaultImports": true,
		// 更兼容的方式处理使用 ES 模块导入和导出的代码
		"esModuleInterop": true,
		// "preserveSymlinks": true,
		// 检查文件名的大小写是否与导入语句中使用的一致。如果不一致,则会发出编译警告或错误。
		"forceConsistentCasingInFileNames": true,
		// 代码校验
		/* Type Checking */
		// 使用严格模式
		"strict": true,
		// 防止变量或函数的类型被隐式推断为 any 类型
		// "noImplicitAny": true,
		// 编译器会对 null 和 undefined 值进行严格检查,并在代码中强制使用非空值
		// "strictNullChecks": true,
		// 对函数类型的兼容性进行更严格的检查
		// "strictFunctionTypes": true,

		// "strictBindCallApply": true,
		// 会对类成员属性的初始化进行严格检查。具体而言,它要求在声明类成员属性时,要么立即对其进行初始化,要么在构造函数中对其进行初始化,以确保所有的类成员属性都被正确初始化。
		// "strictPropertyInitialization": true,
		// 对函数中的 this 指向进行检查。如果函数中使用了 this,但其类型没有明确声明,或者不能确定其类型,则编译器会报错。
		// "noImplicitThis": true,
		// "useUnknownInCatchVariables": true,
		// 会在生成的 JavaScript 代码中始终包含 "use strict" 指令。这意味着生成的 JavaScript 代码将采用严格模式,强制执行更严格的语法和行为规则
		// "alwaysStrict": true,
		// 检查是否存在未使用的局部变量,并给出相应的警告或错误。
		// "noUnusedLocals": true,
		// 检查是否存在未使用的函数参数,并给出相应的警告或错误。
		// "noUnusedParameters": true,
		// "exactOptionalPropertyTypes": true,
		// 检查是否所有的代码路径都有返回值。如果存在某些代码路径没有明确的返回语句,编译器就会发出警告或错误。
		// "noImplicitReturns": true,
		// 检查 switch 语句中是否存在没有明确的 break 或 return 语句的情况。如果存在这样的情况,编译器就会发出警告或错误。
		// "noFallthroughCasesInSwitch": true,
		// 对数组和元组进行索引访问时,要求开发者显式地处理可能导致空值(undefined)或无效值的情况,以避免潜在的空指针异常。
		// "noUncheckedIndexedAccess": true,
		// "noImplicitOverride": true,
		// 禁止在具有索引签名的类型中使用属性访问操作符(.)来访问属性,以防止出现潜在的类型不匹配或运行时错误
		// "noPropertyAccessFromIndexSignature": true,
		// "allowUnusedLabels": true,
		// "allowUnreachableCode": true,
		/* Completeness */
		// 是否跳过对默认库文件(如 lib.d.ts)的类型检查,默认库文件包含 TypeScript 标准库的声明和类型定义。
		// "skipDefaultLibCheck": true,
		// 是否跳过对所有声明文件(.d.ts)的类型检查,包括默认库文件和自定义的外部类型声明文件。
		"skipLibCheck": true
	}
}

# 2.ts基本类型