-
Notifications
You must be signed in to change notification settings - Fork 6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
玩转nodeJs文件模块 #34
Comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
前言
上篇50+行代码搞定一行命令更新Npm包 - 掘金 (juejin.cn)介绍了自动化push仓库&&自动化更新版本等功能的实现。这篇说说自动生成模板文件、rollup按需加载打包配置以及自动生成目录文件,简单得不像话!
按需加载打包配置
首先创建一个
rollup.config.js
文件,然后下载需要的插件,创建文件pluginsCommon.js
用于配置共同的插件,相关代码如下:不了解的插件,请Google。
rollup提供了很多种打包格式rollup打包格式 ,我需要的是一个用于做CDN加速的
medash.min.js
文件格式为umd
以及按需加载的若干cjs
格式文件。medash.min.js
文件容易得到,只需要设置打包入口文件,入口文件为main.ts
,向rollup.config.js
中添加如下内容即可:按需加载打包配置稍微麻烦点,我需要获取所有需要按需打包的文件路径。一个文件一个文件的手动写入相当麻烦,为此我创建一个
build.js
文件用于自动获取打包文件的路径。我定义了一个变量名
buildInputs
的数组,用于存储所有的文件路径,所有需要打包的文件均存于src
目录下。思路: 获取
src
目录下所有的文件或文件夹,逐一进行遍历。若文件类型为ts
时,获取该文件的相对路径push
到buildInputs
数组中;若文件类型是一个文件夹时,获取该文件夹下的文件目录,重复上一步操作。实现上述需要使用nodeJs fs模块以及path模块,先进行导入:
fs.readdirSync(path)
获取文件夹目录文件:获取文件相对路径并
push
至buildInputs
数组:Path.extname(childrenPath)
获取文件后缀名,针对不同的后缀名做不同的逻辑处理:效果演示:
源码地址:https://github.com/CatsAndMice/medash/blob/dev/rollup.config.js
自动生成模板文件
能帮我解决什么问题
src
文件下的xxx.ts
、测试test
文件夹下的xxx.test.ts
、文档docs
文件夹下的xxx.md
以及example
文件下的xxx.ts
,我想要自动进行创建;xxx.test.ts
、案例xxx.ts
导入以及main.ts
文件中导入导出步骤,我想要自动完成这一步的操作。开撸
50+行代码搞定一行命令更新Npm包 - 掘金 (juejin.cn)中,提及到了inquirer 。同样的,实现自动生成模板文件也从终端交互入手。
先在
build
文件夹下,创建一个create.ts
文件。我想增加一个方法时,终端应该提供一个目录选择,以便将增加的文件创建在对应的目录下,当我选择对应的目录后终端提供一个类似输入框的功能,用于给文件命名。
目录选择代码:
其中
getSrcLists
方法作用是获取src
下的文件夹名称,用于进行目录选择。import fs from "fs/promises";
导出的fs/promises
模块与import fs from "fs";
导出的fs
模块,区别在于fs
模块API采用的是回调,而fs/promises
模块的API支持Promise
,开发者使用更方便。srcPath
其实就是一个绝对路径,const.ts
文件下就一行代码搞定。创建文件命名功能是
getName(list)
方法,参数list
是用户选择的目录。命名校验:
效果演示:
文件命名后,接下来就是创建对应的文件:
createPath、createTestPathPath、createDocsPath 、createExamplePath
这四个变量分别是src
文件下xxx.ts
、测试test
文件夹下xxx.test.ts
、文档docs
文件夹下xxx.md
以及example
文件夹下xxx.ts
的路径。方法
createTestFile、createFile、createDocs、createExample
逻辑类似,区别是创建的文件后缀名以及写入的内容。创建
createAndWrite.ts
文件,用于抽离公共的创建文件夹与创建文件并写入的功能:create
方法用于创建文件夹,write
方法用于创建文件并写入内容。createTestFile、createFile、createDocs、createExample
逻辑是类似的,所以这里只把createFile
文件粘贴出来:createTestFile、createFile、createDocs、createExample
文件中会改变的变量const suffixName = name + '.ts';
,还有就是srcContext
。'.ts'
表示文件的后缀名,需要创建的文件后缀名有.md、.test.ts、.ts
;srcContext
是写入文件的内容函数,不同的文件写入的内容不同,而createTestFile、createFile、createDocs、createExample
中获取写入内容的函数名不同。写入文件的内容是提前定义在
consts.ts
文件中,这里代码就不粘贴了,感兴趣的读者请点击下面的源码地址。源码地址:https://github.com/CatsAndMice/medash/blob/dev/build/const.ts
整体的代码目录:
源码地址:https://github.com/CatsAndMice/medash/tree/dev/build
最后,解决新增方法自动导入
main.ts
还有导出问题 。同样的,我在
create.ts
文件中往getName
方法内添加一个addMainContext
方法:addMainContext
文件中,代码逻辑为先读取main.ts
内容,然后进行内容分段,判断是否已重复来决定是否添加该新的方法,最后再重新写入main.ts
。先看下
main.ts
内容:它存在两种导出方式,导出方式均以
export
关键字开头,所以读取main.ts内容后以export
进行分割,把内容分成三部分存放至一个数组中。第一部分是
import
导入文件,第二、三部分都是导出。导入内容部分用于判断是否为重复导入,导出部分以{
再次分割,分割完成后再把新增方法名重新拼接。最后,再将内容写入main.ts 。
效果演示:
源码地址:https://github.com/CatsAndMice/medash/blob/dev/build/addMainContext.ts
自动生成目录文件
能帮我解决什么问题
docs/v3
文件夹下,docsify生成文档站,前提是要把文档文件路径以[xxx](相对路径)
的格式收录至_sidebar.md
文件中,一个一个的手动写入太麻烦,我想要自动进行录入。录入后,运行docsify可以得到一个在线文档网站链接了。
开撸
在自动生成模板文件一节中,有提及到一个
createDocs
方法,它用于创建.md
文件并写入内容。自动生成目录实现从它这里入手。先展示下它所处的目录:
从上图中注释,可以看出创建目录的入口为
readDir
函数,该函数作为参数被传递到write
方法,这样做的目的是.md
创建后才执行readDir
更新目录。获取文件夹目录,逐一遍历创建异步函数去拼接
[xxx](相对路径)
,并将异步函数添加至promises
数组。content += getContent(dir, files);
getContent
用于排序并拼接内容格式,拼接好的格式再与变量content
拼接。promises
数组中所有的异步函数出结果后,将会执行() => { writeContent(content());}
写入内容至_sidebar.md
。一个简简单单的目录生成功能就完成了。
效果演示:
源码地址:https://github.com/CatsAndMice/medash/blob/dev/build/createDocs.ts
最后
文章介绍了作者使用nodeJs解决一些重复性的操作,也算是对nodeJs文件模块的一种刻意练习。
码字不易!如果我的文章对你有帮助,你的👍就是对我的最大支持^_^。
The text was updated successfully, but these errors were encountered: