基本共有套路
首先是要先把包给发布出来,前面的教程很明确,基本囊括所有,除了包的具体功能要扩展,其他先要干的就是一个流程:
- 新建文件夹,里面建立package.json文件
终端输入
npm init -y
傻瓜式操作,注意命名冲突的错误。
- 新建index.js文件
根据上次的教程,做成命令工具,index.js开头有句话:
#!/usr/bin/env node
- package.json的对象里新增一个属性:
"bin": {
"mdtohtml": "./index.js"
}
现在想想思路:
我们是要在一个目录下输入命令
mdtohtml file.md out.html
得到一个file.md文件,读取,得到字符串,处理字符串,写入html。
这里有个问题,现在刚发布,正在开发,修改代码就要发布,再执行,,,太麻烦了。
依靠调用命令的指针原理,调用的就是下载到本地的/usr/local/lib/node_modules/markdowntoohtml/index.js(mac的),那就在这个文件上修改,再直接调用命令测试,直到可以了,然后再把结果复制到包的文件里,再发布。
开始实现功能
需要从用户输入的命令里得到目标文件
首先,肯定是输入了一个类似a.md的一个文件名,然后如何得到这个文件的绝对路径?
一个模块process.argv功能,它可以传入参数的,这时候,在index.js写入console.log(process.argv)测试下,运行命令
mdtohtml a.md b.html

数组啊,第三四项就是我们的参数啊。
所以传参就容易了,index.js里输入
if (process.argv.length < 4) {
console.log('输入的参数不对,,,')
} else {
var inputPath = process.argv[2]
var outputPath = process.argv[3]
}
读文件写文件
需要nodejs内置模块,index.js写入
var fs = require('fs')
if (process.argv.length < 4) {
console.log('输入的参数不对,,,')
} else {
var inputPath = process.argv[2]
var outputPath = process.argv[3]
fs.readFile(inpath, 'utf8', function(err, str) {
if (err) {
console.log('read failed,,,')
} else {
console.log(str)
fs.writeFile(outpath, result, function(err) {
if (err) {
return console.log('read failed,,,')
} else {
console.log('writed,,,,')
}
})
}
})
}
三个要处理的问题
- 读取文件路径的获取inpath获取
引入一个模块功能process.cwd(),它是得到了一个当前所在的目录的路径,然后再加上inputPath,不就是了吗?
又有一个问题了,mac跟win系统的路径表现不一样啊,这个不是问题啊,再引入一个模块path,反正是问题的差不多都解决了,
var path = require('path')
inpath 就是path.resolve(process.cwd(),inputPath)
- 同理写入的文件outpasth类似了:
path.resolve(process.cwd(),outputPath)
- 读到str数据了,要处理成html格式了,也就是上面那一串的里的result,它是什么呢?
需要对应的包包,npm上查一下
得到一个markdown-it的包,看了它的教程,直接先安装到本地目录下,然后再index.js写入
var mdit = require('markdown-it')
var md = new mdit()
result就是 md.render(str)
最终的全部代码就是
var fs = require('fs')
var path = require('path')
console.log(process.argv)
var mdit = require('markdown-it')
var md = new mdit()
if (process.argv.length < 4) {
console.log('输入的参数不对,,,')
} else {
var inputPath = process.argv[2]
var outputPath = process.argv[3]
console.log(process.cwd())
fs.readFile(path.resolve(process.cwd(), inputPath), 'utf8', function(err, str) {
if (err) {
console.log('read failed,,,')
} else {
console.log(str)
var result = md.render(str)
fs.writeFile(path.resolve(process.cwd(), outputPath), result, function(err) {
if (err) {
return console.log('read failed,,,')
} else {
console.log('writed,,,,')
}
})
}
})
}
测试一下

在终端里,a.md所在路径下,输入
mdtohtml a.md b.html
结果:

网友评论