TypeScript Nodejs 项目结构

偷懒的程序员 2018-10-26 17:44:24 ⋅ 688 阅读

1. 新旧交替

新事物代替旧事物无外乎旧事物太陈旧。

JS动态软类型语言,便利的同时也带来了很多弊端,随着项目的增大,加上没有注释,你完全会懵逼。

可以看下网上汇总的错误信息,有多少个是类型错误引起的

图为rollbar统计的数千个项目中数量最多的前十个异常而TS在你编写代码的时候,你就可以很直观的看到哪个变量有效、哪个变量重名、哪个变量不可以更改等等; 并且提供了多种数据类型,更加面向对象

掘金上有一篇对比JS 与 TS的文章,我摘录一段

 
  1. 1. TypeScript 从核心语言方面和类概念的模塑方面对 JavaScript 对象模型进行扩展。

  2. 2. JavaScript 代码可以在无需任何修改的情况下与 TypeScript 一同工作,同时可以使用编译器将 TypeScript 代码转换为 JavaScript

  3. 3. TypeScript 通过类型注解提供编译时的静态类型检查。

  4. 4. TypeScript 中的数据要求带有明确的类型,JavaScript不要求。

  5. 5. TypeScript 为函数提供了缺省参数值。

  6. 6. TypeScript 引入了 JavaScript 中没有的“类”概念。

  7. 7. TypeScript 中引入了模块的概念,可以把声明、数据、函数和类封装在模块中。

作为后端开发,也许会被传统的C、C++、Java、C#误以为是前端或小儿科,能干啥大事,

编程语言的鄙视链

asm → C ↔ C++ ↔ Java ↔ C# → JavaScript → VB → VBScript Common Lisp ↔ Scheme → Emacs Lisp →→ Python Python ↔ Perl → shell → PHP → all

除了PHP,我谁都不服

没有调研的鄙视就是耍流氓

金无足赤、人无完人,更何况语言,所以各自发挥自己的优势就好,为啥要鄙视!!!真是的记得 改天,咱一块diss PHP兄弟 ^_^

当你们都做老板的时候,我一开始身体力行,钱不好赚啊!Node.js : 我只需要一个店小二

2. TypeScript在node中的应用

在TS的官网中,有着大量的示例,其中就找到了Express版本的例子.有兴趣的可以参考一下,我自行更改了一些,目录结构如下

 
  1. .  

  2. ├── build  // 编译文件

  3. ├── node_modules  // 模块文件

  4. ├── src // 资源文件

  5.    ├── app.ts // 程序入口

  6.    ├── config  // 配置文件

  7.       ├── config-local.ts

  8.       ├── config-production.ts

  9.       ├── index.ts  // index 文件

  10.    ├── controllers // 负责具体的业务模块流程的控制

  11.       ├── index.ts

  12.       └── user.ts

  13.    ├── daos // 负责与数据库进行联络

  14.       ├── index.ts

  15.       └── user

  16.    ├── doc // 可以存放一些文件

  17.    ├── models  // 表映射

  18.       ├── entity

  19.       ├── enum.ts

  20.       └── index.ts

  21.    ├── router  // 处理接口请求

  22.       ├── index.ts

  23.       └── user.ts

  24.    ├── routerToken  // 处理接口请求

  25.       ├── basic.ts

  26.       └── index.ts

  27.    └── utils // 常用模块封装

  28.        ├── index.ts

  29.        └── log.ts

  30. ├── test // 测试文件

  31.    └── test.ts

  32. ├── views // 视图

  33. ├── package.json  

  34. ├── tsconfig.json  // TS 配置文件

  35. └── tslint.json // 代码规范

这样做的好粗是啥??送给没有解耦的小伙伴

3. 相应配置

1. MySQL

可以使用sequelize-typescript, 书写中像调用模块一样,可看到数据结构;暂没找到,可以自动导出的脚本,不像Sequlize-auto可以直接导出js文件。如果谁有办法脚本导出,请告我一下,谢啦!!

2. tslint 代码规则

官方 tslint 规则 , 实例如下: 摘录自--TSLint配置小结

 
  1. {

  2.    "rules": {

  3.        // TS特性

  4.        "member-access": true, // 设置成员对象的访问权限(public,private,protect)

  5.        "member-ordering": [// 设置修饰符顺序

  6.            true,

  7.            {

  8.                "order": [

  9.                    "public-static-field",

  10.                    "public-static-method",

  11.                    "protected-static-field",

  12.                    "protected-static-method",

  13.                    "private-static-field",

  14.                    "private-static-method",

  15.                    "public-instance-field",

  16.                    "protected-instance-field",

  17.                    "private-instance-field",

  18.                    "public-constructor",

  19.                    "protected-constructor",

  20.                    "private-constructor",

  21.                    "public-instance-method",

  22.                    "protected-instance-method",

  23.                    "private-instance-method"

  24.                ]

  25.            }

  26.        ],

  27.        "no-empty-interface":true,// 不允许空接口

  28.        "no-parameter-reassignment":true,// 不允许修改方法输入参数

  29.        "prefer-for-of":true,// 如果for循环中没有使用索引,建议是使用for-of

  30.        // 功能特性

  31.        "await-promise":true,// 不允许没有Promise的情况下使用await

  32.        "curly":true,// if/for/do/while强制使用大括号

  33.        "forin":true,// 使用for in语句时,强制进行hasOwnProperty检查

  34.        "no-arg":true,// 不允许使用arguments.callee

  35.        // "no-bitwise":true, // 不允许使用特殊运算符 &, &=, |, |=, ^, ^=, <<, <<=, >>, >>=, >>>, >>>=, ~

  36.        "no-conditional-assignment":true,// do while/for/if/while 语句中将会对例如if(a=b)进行检查

  37.        // "no-console":true,// 不允许使用console对象

  38.        "no-debugger":true,// 不允许使用debugger

  39.        "no-duplicate-super":true,// 不允许super() 两次使用在构造函数中

  40.        "no-empty":true,// 函数体不允许空

  41.        "no-eval":true,// 不允许使用eval

  42.        "no-for-in-array":true,// 不允许对Array使用for-in

  43.        "no-invalid-template-strings":true,// 只允许在模板字符串中使用${

  44.        "no-invalid-this":true,// 不允许在class之外使用this

  45.        "no-null-keyword":true,// 不允许使用null,使用undefined代替null,指代空指针对象

  46.        "no-sparse-arrays":true,// 不允许array中有空元素

  47.        "no-string-throw":true,// 不允许throw一个字符串

  48.        "no-switch-case-fall-through":true,// 不允许case段落中在没有使用breack的情况下,在新启一段case逻辑

  49.        "no-unsafe-finally":true,// 不允许在finally语句中使用return/continue/break/throw

  50.        "no-unused-expression":true,// 不允许使用未使用的表达式

  51.        "no-use-before-declare":true,// 在使用前必须声明

  52.        "no-var-keyword":true,// 不允许使用var

  53.        "radix":true,// parseInt时,必须输入radix精度参数

  54.        "restrict-plus-operands":true,// 不允许自动类型转换,如果已设置不允许使用关键字var该设置无效

  55.        "triple-equals":true,// 必须使用恒等号,进行等于比较

  56.        "use-isnan":true,// 只允许使用isNaN方法检查数字是否有效

  57.        // 维护性功能

  58.        "indent":[true, "spaces", 4],// 每行开始以4个空格符开始

  59.        "linebreak-style":[true,"CR/LF"],// 换行符格式 CR/LF可以通用使用在windows和osx

  60.        "max-classes-per-file":[true,1],// 每个文件中可定义类的个数

  61.        "max-file-line-count":[true,500],// 定义每个文件代码行数

  62.        "max-line-length":[true,120],// 定义每行代码数

  63.        "no-default-export":true,// 禁止使用export default关键字,因为当export对象名称发生变化时,需要修改import中的对象名。https://github.com/palantir/tslint/issues/1182#issue-151780453

  64.        "no-duplicate-imports":true,// 禁止在一个文件内,多次引用同一module

  65.        // 格式

  66.        "align":[true,"parameters","arguments","statements","members","elements"],// 定义对齐风格

  67.        "array-type":[true,"array"],// 建议使用T[]方式声明一个数组对象

  68.        "class-name":true,// 类名以大驼峰格式命名

  69.        "comment-format":[true, "check-space"],// 定义注释格式

  70.        "encoding":true,// 定义编码格式默认utf-8

  71.        "import-spacing":true,// import关键字后加空格

  72.        "interface-name":[true,"always-prefix"],// interface必须以I开头

  73.        "jsdoc-format":true,// 注释基于jsdoc风格

  74.        "new-parens":true,// 调用构造函数时需要用括号

  75.        "no-consecutive-blank-lines":[true,2],// 不允许有空行

  76.        "no-trailing-whitespace": [// 不允许空格结尾

  77.            true,

  78.            "ignore-comments",

  79.            "ignore-jsdoc"

  80.        ],

  81.        "no-unnecessary-initializer":true,// 不允许没有必要的初始化

  82.        "variable-name":[true,"check-format",// 定义变量命名规则

  83.            "allow-leading-underscore",

  84.            "allow-trailing-underscore",

  85.            "ban-keywords"]

  86.    }

  87. }

3. tsconfig.json 配置

首选TypeScript中文网-编译选项

TS 使用 tsconfig.json 作为其配置文件,它主要包含两块内容:

 
  1. 1. 指定待编译的文件

  2. 2. 定义编译选项

1. 指定待编译的文件

第一个实例

 
  1. {

  2. // 配置编译选项

  3. "compilerOptions": {

  4.    "module": "commonjs",

  5.    "noImplicitAny": true,

  6.    "removeComments": true,

  7.    "preserveConstEnums": true,

  8.    "sourceMap": true

  9.  },

  10. // 指定待编译文件

  11.  "include": [

  12.    "src/**/*"

  13.  ],

  14. // 排除待编译文件

  15.  "exclude": [

  16.    "node_modules",

  17.    "**/*.spec.ts"

  18.  ]

  19. }

include 和 exclude 属性是一个数组<也可以用file>,但数组元素是类似 glob 的文件模式。它支持的 glob 通配符包括:

 
  1. * :匹配 0 或多个字符(注意:不含路径分隔符)

  2. ? :匹配任意单个字符(注意:不含路径分隔符)

  3. **/ :递归匹配任何子路径

在继续说明之前,有必要先了解下在编译器眼里什么样的文件才算是 TS 文件

 
  1. .ts、.tsx .d.ts 的文件。

如果开启了 allowJs 选项,那 .js 和 .jsx 文件也属于 TS 文件。

2. 编译选项

常用选项

选项字段 类型 默认值 说明
allowJs boolean false 允许编译 JS 文件
declaration boolean false 生成对应的 .d.ts 文件
checkJs boolean false 报告 JS 文件中存在的类型错误需要配合 allowJs 使用
declarationDir string - 生成的 .d.ts 文件存放路径默认与 .ts 文件相同
experimentalDecorators boolean false 启用实验功能-ES 装饰器
lib string[] - 编译时引入的 ES 功能库,包括:es5 、es6、es7、dom 等。如果未设置,则默认为: target 为 es5 时: ["dom", "es5", "scripthost"] target 为 es6 时: ["dom", "es6", "dom.iterable", "scripthost"]
module string target === "es3" or "es5" ?"commonjs" : "es6" 生成的模块形式:none、commonjs、amd、system、umd、es6、es2015 或 esnext 只有 amd 和 system 能和 outFile 一起使用 target 为 es5 或更低时可用 es6 和 es2015
noImplicitAny boolean false 存在隐式 any 时抛错
noImplicitReturns boolean false 不存在 return 时抛错
noImplicitThis boolean false this 可能为 any 时抛错
outDir string - 编译生成的文件存放路径默认与 .ts 文件相同
sourceMap boolean false 生成 .map 文件
target string es2017 生成 .js 文件版本

更加完整的请参考: TypeScript中文网-编译选项

---------------END----------------

IT



全部评论: 0

    我有话说:

    TypeScript Nodejs 项目结构

    新旧交替新事物代替旧事物无外乎旧事物太陈旧。JS动态软类型语言,便利的同时也带来了很多弊端,随着...

    【开源资讯】TypeScript 4.0.5 发布

    TypeScript 4.0.5 发布了,本次更新主要解决了 4.0 版本以来出现的一些问题,提高了整体的稳定性。详细更新如下:BUG 修复1、解决了对于版本 4.0,创建可释放程序包删除

    数据结构

    结构,简单的理解就是关系。严格点说,结构是指各个组成部分相互搭配和排列的方式。在现实世界中,不同数据元素之间不是独立的,而是存在特定的关系,我们将这些关系成为结构。 数据结构:是相互之间存在一种

    Node实战篇:阶段项目(九)

    项目整体预览 项目的github地址 界面逼格还行-_- 主要功能: 登陆; 退出; 所用的主要模块: express, 路由.静态文件.模块分工等; express-session, 采用

    TypeScript教程

    VSCode+TypeScript 开发Nodejs只有更溜

    Nodejs视频服务器 切片ffmpeg

    Node 视频服务器 切片ffmpeg

    Node模块之Events模块(五)

    Node模块之Events模块(五)

    Node异步式I/O和异步式编程(三)

     Node.js 最大的特点就是异步式 I/O(或者非阻塞I/O)与事件紧密结合的编程模式。 第一部分: I/O 1.阻塞I/O与非阻塞I/O概念 1.1阻塞I/O(同步I/O) 线程在

    Node实战篇:Express--jade模板引擎(七)

    Jade(Pug) — Node Template Engine,一个高性能的模板引擎,专为 Node 而做......

    Node模块之fs模块(六)

    屏幕快照 2017-08-08 上午10.53.21.png 第一部分 概述 Node.js 提供一组类似UNIX(POSIX)标准的文件操作API,Node.js中操作文件的模块是fs(File

    Node实战篇:Express路由(三)

    Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用。

    2018年8个技巧来构建更好的Node.js应用程序

    2018年8个技巧来构建更好的Node.js应用程序

    Nodejs 接入 公众号【逗比版】

    Nodejs 接入 公众号 需求:Boss: 我们要接入公众号,你看下文档对接下。Me: 🆗 然后,可能因为对腾讯的反感,加之网上对腾讯的吐槽,怀着愤世嫉俗的态度胡乱的找资源,看方案

    Node 模块之 util URL queryString path(八)

    第一部分 util util是一个Node.js核心模块,util模块设计的主要目的是为了满足Node内部API的需求。其中包括:格式化字符串、对象的序列化、实现对象继承等常用方法。要使用util

    NodeJS 10.5.0 中的线程:实用介绍

    几天前,Node.js版本10.5.0发布,其中包含的主要功能之一是添加了线程支持。

    TypeScript教程

    TypeScript--用的人都说好👌

    Node实战篇:Nodejs 链接 Mariadb 实例

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL

    Node模块(四)

    模块化分工、各司其职

    Node包管理NPM(二)

    NPM是什么? [NPM官网](https://docs.npmjs.com/)给出解释如下: ``` Use npm to install, share, and distribute code; manage dependencies i...