Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >初识TypeScript:查找指定路径下的文件按类型生成json

初识TypeScript:查找指定路径下的文件按类型生成json

作者头像
汐夜koshio
发布于 2020-08-11 08:17:39
发布于 2020-08-11 08:17:39
3.4K00
代码可运行
举报
文章被收录于专栏:U3DU3D
运行总次数:0
代码可运行

如果开发过node.js的话应该对js(javascript)非常熟悉,TypeScript(以下简称ts)是js的超集。

下面是ts的官网:

https://www.tslang.cn/

1.环境配置(如果已经进行过环境配置,可以跳过此步)

开发ts需要先简单的配置开发环境,如果使用的是Visual Studio,只需要简单装一个node.js的组件包即可:

该组件包主要包含Node.js开发工具,js和ts语言支持;除了该工具包外,还需要额外安装ts sdk:

但如果使用的是VS Code的话,这些就需要自己手动安装和配置了,node.js开发工具的下载地址为:

https://nodejs.org/en/download/

安装完node就可以运行npm指令了,npm是Node.js包管理器(node package manager),你可以认为它是一个巨大的云端数据库,其中集成了大量js或ts开发中需要的包和代码模块,当你在项目中需要引用这些包或模块时,随时可以利用npm指令进行快速下载使用,这样不被引用的模块不必占用过多项目空间。比如,可以直接利用npm来安装ts,打开cmd输入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> npm install -g typescript

其中-g表示全局安装,在npm指令中,install也可以简写为i:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> npm i -g typescript

ts安装完成后,就可以直接创建一个空文件夹作为工程目录了,但这时创建的ts文件并不能编译,因为一个新的ts工程还需要先初始化npm和ts配置文件,可以在VS Code中直接调用新的终端:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> npm init -y
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> tsc -init

执行完这两条指令后,我们会发现工程中生成了两个json文件,它们分别是package.json和tsconfig.json;参数-y表示按照默认方式生成,tsc即为type script config的缩写。

package.json中记录了整个工程的基本信息,简化的命令行指令,以及当前工程的依赖模块和库等;开发者可以自行在该文件的scripts块中添加自定义的指令,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    "start": "tsc main.ts && node main.js",
    "build": "tsc main.ts && pkg -t win main.js"

这样便可以直接调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> npm run start
> npm run build

来代替执行自定义添加的命令行内容;在第一次build时,系统一般会告诉你它蠢蠢的没有找到pkg,这时,你只需要执行安装它的指令即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> npm i -g pkg

同样的,之后在编译过程中遇到了引用的模块或库找不到的情况,可以先考虑该模块是否安装,如果没有,都可以执行类似的安装指令,但需要区分是否全局安装。

回过头来说下pkg是什么东西,这是将Node.js项目打包为可执行文件的一个工具,参数-t win 表示生成的目标(target)平台为windows,更多详情了解可见github:

https://github.com/vercel/pkg

另外,为了更方便的通过ts来引用一些常用的node.js库,可以考虑提前执行以下指令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> npm i @types/node --save-dev

完成后,工程目录的node_modules下会自动添加对应安装的库。参数-save意思是在package.json中保存并写入该依赖库,-dev指的是仅在开发阶段需要依赖该库,编译部署后则不再依赖。

2.正式编写

在正式开始编写之前,需要明确的是,ts并非强封装类型的语言,和很多面向对象的编程语言有一定的区别,也不需要程序入口一样的main函数,而是从上到下,从左到右依次读取程序中的每一行;

当然了,这并不代表ts不能实现封装,你依然可以将固定的代码块封装为函数或类,但这并非是强制性的。

为了对文件和路径进行操作,需要提前引用一些模块,类似于C#中的using,ts中的格式则类似于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import * as fs from 'fs';
import * as path from 'path';

因为之前已经安装过@types/node, 所以这里不会出现找不到引用的报错。当然了,还可以用另一种方式来引用模块:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require('fs');
const path = require('path');

顺便提一句ts中声明的几个关键字const,var,let;const和var在C#也有,分别用于声明常量与局部变量,而let是我之前没有见过的,在网上查阅之后,发现let和var很多地方都是类似的,但有以下几点区别:

1.var声明的变量会自动提升到该语句所在代码块的开头(但注意初始化的赋值并不会),这种现象称为变量提升;而let不具备变量提升的特性

造成的影响便是,var可以先使用后声明,不会有任何报错,而是会输出未定义类型undefined,但let这么做就会直接报错(迷)

2.var允许重复声明同一变量,会覆盖之前变量的值,但let则不能重复声明同一变量(迷)

3.var重复声明变量时内部代码块的值可以覆盖外部值(什么还有这种操作?!),但let则表现为不同的两个变量,

主要因为var与let声明的变量作用范围不同,var的作用范围包含子块以及它所在的函数的任何位置(迷),而let只在当前块(不包含子块)中有效

emm...感觉和C#里的var完全不一样啊,作为新手如果为了保险起见,可以均使用let来声明局部变量。

下面的方法为查找指定路径下的文件,并将所有文件的绝对路径存储到一个临时的数组中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 let temp: string[] = new Array();
 2 function fileDisplay(filePath: string) {
 3     // 根据文件路径读取文件,返回一个文件列表
 4     const files = fs.readdirSync(filePath);
 5     // 遍历读取到的文件列表
 6     for (let filename of files) {
 7         // path.join得到当前文件的绝对路径
 8         const filepath = path.join(filePath, filename);
 9         // 根据文件路径获取文件信息
10         const stats = fs.statSync(filepath);
11         const isFile = stats.isFile(); // 是否为文件
12         const isDir = stats.isDirectory(); // 是否为文件夹
13         if (isFile) {
14             temp.push(filepath);
15         }
16         if (isDir) {
17             fileDisplay(filepath); // 递归,如果是文件夹,就继续遍历该文件夹里面的文件
18         }
19     };
20 }

注意在上述的方法中需要需要同步读取文件(Sync),而不应该采取默认的异步读取,这样之后的代码中取到temp数组时才会得到正确的值,如果非要异步读取,则需要用回调的方式来写json。

为了获得命令行中输入的参数,可以使用下面的语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let argument = process.argv.splice(2);

process.argv()为node.js中返回当前命令行参数的方法,其中2代表的是实际输入的参数数组,如果输入0的话则代表获取node,1的话返回执行的js的完整路径

之后直接将命令行输入的第一个参数,也就是用户键入的文件夹路径作为参数传递给fileDisplay方法即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fileDisplay(argument[0]);

得到所有的文件路径后,接下来就是按照文件的类型写入json中了

首先我们需要先遍历所有的文件路径,通过路径字符串可以得到文件的一些基本信息,例如文件的拓展名,文件的基本名称等,通过文件的扩展名可以对文件资源的类型重定义和分类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 for (let item of temp)
2 {
3     let extname = path.extname(item);//获取文件的扩展名,带.
4     let basename = path.basename(item, extname);//获取文件的基本名称,第二个参数为需要剔除的扩展名
5     //...
6 }

当然了,如果你不想用path模块的方法,也可以直接用字符串的方式来截取:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    let fileExtension = item.substring(item.lastIndexOf('.'));
//
    let fileName = item.substring(item.lastIndexOf('\\') + 1, item.lastIndexOf('.'));

需要注意的是,在ts中遍历元素内容的方式为of而非in(习惯C#了这里被坑了一把),in只能遍历出索引...

另外,匹配[\]时需要用两个[\\]才可以,因为一个[\]代表的大多为转义字符。

根据文件的扩展名返回自定义的文件类型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 function GetType(extension: string): string {
 2     switch (extension) {
 3         case ".png":
 4         case ".jpg":
 5             return "image";
 6         case ".fnt":
 7             return "bitmapFont";
 8         case ".TTF":
 9         case ".ttf":
10             return "font";
11         case ".spine":
12         case ".particle":
13             return "particle";
14         case ".mp3":
15             return "audio";
16         default:
17             return "null";
18     }
19 }

筛选过滤文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1     let type = GetType(extname);
2     //过滤非指定类型文件
3     if (type == "null")
4         continue;
5     //过滤重名文件
6     if (resources[basename]) {
7         console.log(`错误!!!该文件名已存在【${basename}`);
8         continue;
9     }

定义json基础数据结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 let outjson: any = {}
2 let resources: any = {};
3 let d: any = {};
4 
5 d.tye = type;
6 d.url = item;
7 
8 resources[basename] = d;
9 outjson.resources = resources;

上面是为了更方便读者理解而将这三个变量放在一起,实际上变量d是在循环体内部声明的局部变量,any类型是ts中的一种特殊类型,它可以被定义为任何一种其他类型,这里将它定义为了一种大括号类型的数据结构,代表它的内部还有一些其他的任意成员变量。

如果是在C#中书写json的数据结构,将是一件非常麻烦的事,需要严格的定义为一个新的类或结构体,但ts中似乎相当自由,只需要用一个变量来代替即可,甚至直接在赋值初始化的时候来确定键值。

但网上关于大括号类型的any讲解并不多,所以做了一点额外的测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 let a: any = {};
 2 let b: any = {};
 3 let c: any = {};
 4 a.b = "c";
 5 a.c = 5.6;
 6 a.a = a.b;
 7 a["b"] = a.b;
 8 b["c"] = a.c;
 9 b["a"] = a;
10 c.a = b;
11 c[a.b] = a;
12 console.log(c);

大家可以推导下会打印出什么结果;好,接下来公布答案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 {
 2     a: {
 3         c: 5.6,
 4         a: {
 5             b: 'c',
 6             c: 5.6,
 7             a: 'c'
 8         }
 9     },
10     c: {
11         b: 'c',
12         c: 5.6,
13         a: 'c'
14     }
15 }

下面来进行一个简单的梳理:

测试第四行 代表a中有一个键(变量名)为b的成员,它的值为字符串c

测试第五行 代表a中有一个键(变量名)为c的成员,它的值为数字类型5.6(ts中所有的数字类型均为浮点型,省去了很多其他编程语言中值类型数据的繁琐分类)

测试第六行 代表a中有一个键(变量名)为a的成员,它的值初始化为a中键为b的那个成员的值,也即是同样的字符串c

测试第七行 实际意义与第四行相同,但这里是为了测试[key]这种书写形式所存在的意义,实际上结合第十一行就能得出结论,那就是——当我们需要一个字符串变量而非常量来作为键时就不能直接用“.成员名”的方式了,因为这样的方式只能生成固定的字符串名,

可以再比较以下例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 let x1: any;
 2 let x2: any = {};
 3 x1 = "x2";
 4 x2.x1 = x1;
 5 x2[x1] = x1;
 6 console.log(x2);
 7 x1 = "6";
 8 x2.x1 = x1;
 9 x2[x1] = x1;
10 console.log(x2);

大家可以再推导一下会打印出什么结果;好,现在公布答案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 {
2     x1: 'x2',
3     x2: 'x2'
4 } {
5     '6': '6',
6     x1: '6',
7     x2: 'x2'
8 }

是不是让人有些惊讶,实话说,第二次的打印结果笔者也没有做对,我没有想到它竟然能打印出3个值...原因就在于在第一次中x2[x1]中x1对应的字符串x2这一键并没有被修改或删除,而x2.x1中键x1是一个固定的变量名,所以它的值理所当然的被改变为了后面的字符串6,又因为x1的值已经发生了改变,所以x2[x1]已经不再是原来的任何一个键,从而又生成了一个新的键值对。

经过上面的对比测试,应该已经可以很好的区分什么时候用".成员名",什么时候用[变量]了,返回前面的json的数据结构;因为文件名这一键是根据文件的不同随时都会变化的值,所以采用中括号的形式,而typ,url等为固定的字符串,每一个文件都具备这类成员名,所以直接用点的形式即可。

接下来只需要将json写入到指定的路径即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 //写入json文件选项
2 function writeJson(data: any, jsonFilePath: string) {
3     fs.writeFileSync(jsonFilePath, JSON.stringify(data, null, 4).replace(/\\\\/g, "/"), 'utf-8');
4 }
5 writeJson(outjson, "./default.res.json");

我在写入json时遇到了一个问题,就是路径的\总是在写入时实际文件时变为\\,但在控制台打印字符串时又是正常的(迷),所以没办法就用正则表达式全局匹配\\替换为\,至于出现这个问题的原因到现在还没有弄清楚,如果有大佬发现是什么原因欢迎告知笔者。

3.生成可执行文件和批处理文件

在环境配置时已经说了pkg安装与运行指令,这里直接在命令行中调用:npm run build即可,因为已经设置了平台为win,build后文件夹中就会出现exe文件。

此时直接点击这个应用程序没有任何效果,因为程序中设置的是需要得到用户输入的命令行参数——搜索的文件夹路径才行,当然了,你可以直接打开cmd来执行该exe并设置参数,但每次都要设置参数未免有些难受,这是就可以写一个批处理来执行当前exe所在路径下的文件查找和生成json,这样即使是程序白痴也能用了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
main.exe .\
pause

打开看一下生成的json是否让人满意:(只截取了一部分)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Node.js + typescript 写一个命令批处理辅助工具
工作中遇到这样一些场景:在php混合html的老项目中写css,但是css写着不太好用,然后就想使用预编译语言来处理,或者写上ts。然后问题来了: 每次写完以后都要手动执行一次命令行把文件编译成css文件,然后又要再输入一行命令把css压缩添加前缀;或者把ts编译成js,然后js压缩混淆。
Nealyang
2021/04/20
1.2K0
TypeScript
lib用于指定要包含在编译中的库文件 “lib”:[ “es6”, “dom” ],
jinghong
2020/05/12
1.4K0
1、TypeScript初识及环境搭建
TypeScript最近很火,有很多开源的项目也是由其开发的,如果你是一名前端开发工程师或准备要成为一名前端开发工程师的话,现在如果再不学习TypeScript就真的太OUT了!那么现在请你系好安全带,和我一起踏上学习TypeScript之旅吧!
用户1272076
2019/03/26
4580
TypeScript学习笔记(一)—— TypeScript入门
TypeScript是一种由微软开发的自由和开源的编程语言,它是JavaScript的一个超集,扩展了JavaScript的语法,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。安德斯·海尔斯伯格,C#的首席架构师,工作于TypeScript的开发。
张果
2022/10/04
1.2K0
TypeScript学习笔记(一)—— TypeScript入门
SpringBoot-13-插曲之Node文件重命名+自动生成json对象
遇到的问题:图片太多,使用起来挺麻烦 [1]有很多图片放服务器里,怎么能更好的管理,更方便拿到图片呢? [2]想用json 以一个对象数组的形式保存这些图片:以[{img:"图片名"},{img:
张风捷特烈
2018/09/26
5720
基于TypeScript从0到1搭建一款爬虫工具
今天,我们将使用TS这门语言搭建一款爬虫工具。目标网址是什么呢?我们去上网一搜,经过几番排查之后,我们选定了这一个网站。
Vam的金豆之路
2021/12/01
1.4K0
靓仔快来!!用typescript带你搭建一个自己的脚手架
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
南山种子外卖跑手
2022/06/12
1.7K0
靓仔快来!!用typescript带你搭建一个自己的脚手架
TypeScript 入门
通过 node -v 命令查看本机是否安装,如果没有安装,参考node.js安装指南 根据电脑系统环境进行安装
王秀龙
2021/08/23
1.7K0
TypeScript 入门
【愚公系列】2021年12月 Typescript-爬虫案例
文章目录 前言 js配置文件 TS配置文件 一、自建网页爬取 二、爬虫代码 crowller.ts dellAnalyzer.ts leeAnalyzer.ts 三、执行代码后得到 ---- 前言 首先初始化两个文件 js配置文件 npm init -y 生成 { "name": "typescript", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "dev:build": "t
愚公搬代码
2021/12/27
3370
【愚公系列】2021年12月 Typescript-爬虫案例
TypeScript 类型体操 - 实践
像 JS 引擎那些 api,还有浏览器提供的 api,这些基本是必用的,而且都有标准的。所以 TypeScript 给内置了它们的类型声明。
Cellinlab
2023/05/17
3250
会写 TypeScript 但你真的会 TS 编译配置吗?
随着 TypeScript 的流行,越来越多的项目通过使用 TypeScript 来实现编写代码时候的类型提示和约束,从开发过程中减少 BUG 出现的概率,以此提升程序的健壮性和团队的研发效率。
小东同学
2022/07/29
3.9K1
会写 TypeScript 但你真的会 TS 编译配置吗?
如何在 Node.js 中使用 TypeScript
这是一篇为初学者详细介绍如何在 Node.js 中使用 TypeScript的指南。本指南将涵盖基础知识、开发环境的设置以及一些实用的代码示例。希望这篇文章能够帮助你顺利入门并在未来的项目中应用这些技术。
摸五休二
2024/06/21
8530
如何在 Node.js 中使用 TypeScript
Webpack入门到精通(AST、Babel、依赖)
从名字上就能看出他们使用的环境了,需要注意的是env,他的作用是将最新js转换为es6代码。预设是babel插件的组合,我们可以看下package.json(截取一部分):
落落落洛克
2021/09/17
5850
Webpack入门到精通(AST、Babel、依赖)
Typescript学习笔记,从入门到精通,持续记录
TypeScript 最大的优势之一便是增强了编辑器和 IDE 的功能,包括代码补全、接口提示、跳转到定义、重构等。
房东的狗丶
2023/02/17
2K0
【smart-transform】取自 Atom 的 babeljs/coffeescript/typescript 智能转 es5 库
本文介绍了一种用于快速转换 ES6 到 ES5 的轻量级工具 smart-transform。smart-transform 使用基于 babel 的编译器,可以快速将 ES6 代码转换成 ES5 兼容的代码。该工具在 Atom 编辑器中实现了快速转换的功能,同时也提供了一个命令行工具,方便用户使用。通过配置文件,用户可以自定义转换的规则和输出目录。smart-transform 还支持压缩和混淆,以减小文件大小,提高代码的可维护性。
ios122
2018/01/02
7080
typescript中如何直接引入json文件
这是一个单独的文件, 只是引入一个json文件, 使用typescript编写, 发现require关键字出错
cg错过
2020/11/23
9K0
typescript中如何直接引入json文件
TypeScript学习笔记(三)—— 编译选项、声明文件
compilerOptions ⽀持很多选项,常⻅的有 baseUrl 、 target 、 moduleResolution 和 lib 等。 compilerOptions 每个选项的详细说明如下:
张果
2022/10/04
2.6K0
TypeScript学习笔记(三)—— 编译选项、声明文件
基于TypeScript封装Axios笔记(一)
我们开始初始化项目,首先我们先去 GitHub 上创建一个 repo,填好 repo 名称,以及写一下 README,对项目先做个简单的描述。
用户7572539
2020/08/26
3.5K0
【OpenHarmony】TypeScript 语法 ① ( HarmonyOS 官网查找视频教程 | TypeScript 入门 | 网页运行 TS 语言 | 本地安装 TS 编译器 )
进入 HarmonyOS 官网的 开发者学堂 https://developer.huawei.com/consumer/cn/training/ 页面 , 其中提供了大量的鸿蒙教程 ;
韩曙亮
2024/06/02
2330
【OpenHarmony】TypeScript 语法 ① ( HarmonyOS 官网查找视频教程 | TypeScript 入门 | 网页运行 TS 语言 | 本地安装 TS 编译器 )
【学习笔记】黑马程序员Node.js全套入门教程 | 基础篇
每个浏览器都内置了DOM、BOM这样的API函数,因此,浏览器中的JavaScript才可以调用它们。
LonelySnowman
2023/01/29
2.4K0
【学习笔记】黑马程序员Node.js全套入门教程 | 基础篇
推荐阅读
相关推荐
Node.js + typescript 写一个命令批处理辅助工具
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验