根据官网给的API创建项目

  1. 初始化项目
mkdir tinypng // 创建文件夹
npm init // 初始化npm
  1. 安装TinyPng
npm install --save tinify
  1. 根据文档编写代码
const tinify = require("tinify");
tinify.key = "YOUR_API_KEY"; // YOUR_API_KEY为官网注册后给的API密钥
  1. 开始压缩
const source = tinify.fromFile("unoptimized.jpg");
source.toFile("optimized.jpg");

创建全局运行的node脚本

根据阮一峰老师的Node.js命令行程序开发教程,实现可以在任何地方打开终端即可压缩图片:

tp IMAGE_URL // 终端运行tp命令即可
  1. 告诉终端需要使用node来运行
#!/usr/bin/env node // 写index.js文件最上面
  1. 修改index.js的权限
chmod 755 index.js
// 运行之后就可以在当前文件夹使用
./index
  1. 如果想全局运行,则修改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);
      }
    })
  })
}

要的数据都有了,接下来想怎么输出就怎么输出,一般在当前文件夹输出就可以了,所以更改储存路径什么的就没写了…就是比较懒

后面有空再想办法把其它一些功能加上,比如说裁剪等等。