根据官网给的API创建项目
- 初始化项目
mkdir tinypng // 创建文件夹
npm init // 初始化npm
- 安装
TinyPng
包
npm install --save tinify
- 根据文档编写代码
const tinify = require("tinify");
tinify.key = "YOUR_API_KEY"; // YOUR_API_KEY为官网注册后给的API密钥
- 开始压缩
const source = tinify.fromFile("unoptimized.jpg");
source.toFile("optimized.jpg");
创建全局运行的node脚本
根据阮一峰老师的Node.js命令行程序开发教程,实现可以在任何地方打开终端即可压缩图片:
tp IMAGE_URL // 终端运行tp命令即可
- 告诉终端需要使用
node
来运行
#!/usr/bin/env node // 写index.js文件最上面
- 修改
index.js
的权限
chmod 755 index.js
// 运行之后就可以在当前文件夹使用
./index
- 如果想全局运行,则修改
package.json
{
"name": "tinypng",
"bin": {
"tp": "index.js"
}
}
然后执行npm link
,完成后会在终端输出
/usr/local/Cellar/node/9.8.0/bin/tp -> /usr/local/Cellar/node/9.8.0/lib/node_modules/tinypng/index.js
/usr/local/Cellar/node/9.8.0/lib/node_modules/tinypng -> /Users/ITEM_URL
到此为止,就可以在终端中使用命令了。
但是
使用的并不愉快,因为这命令啥用都没有,压缩的是默认的图片,输出的是默认的位置,干不了任何事。
所以
是时候改变了!
tp
命令中可携带参数(即图片的URL
),还能选择是否在当前目录中输入,是否覆盖,图片是否携带-s
后缀,是否可以指定后缀…好多功能可以加!
接收图片路径
node
可以获取命令行参数,方法是使用process.argv
,因此可以在用tp
命令时后面加上压缩文件的路径,即可指定压缩的文件。
tp IMAGE_URL
// 第一个参数process.execPath和第二个参数是元素将是正在执行的JavaScript文件的路径
const path = process.argv[2];
console.log(path) // IMAGE_URL
是否覆盖原文件或者更改文件名
const readline = require('readline')
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
function Compress() {
this.path = process.argv[2];
this.output_path = '';
this.fileName = '';
this.suffix = '';
}
// 是否覆盖
Compress.prototype.cover = function() {
return new Promise(resolve => {
rl.question('是否覆盖原文件?,默认为n(y/n):', res => {
if(res === 'y') {
resolve(true);
}else {
resolve(false);
}
})
})
}
// 是否更名
Compress.prototype.rename = function() {
return new Promise(resolve => {
rl.question('是否更改名称?(y/n) (为n时,默认在文件名后加入后缀-s):', res => {
if(res === 'y') {
rl.question('输入更改后的文件名:', name => {
resolve(name);
})
}else {
resolve(false);
}
})
})
}
要的数据都有了,接下来想怎么输出就怎么输出,一般在当前文件夹输出就可以了,所以更改储存路径什么的就没写了…就是比较懒。
后面有空再想办法把其它一些功能加上,比如说裁剪等等。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!