Node.js命令行翻译工具开发指南:从零到npm发布的完整教程

一. 课程目标

  • 本次课程我们结合之前学过的命令行和网络模块来实现一个命令行翻译工具

二. 初始化

  • 先新建文件夹,我这里命名为node-translation,然后做初始化项并修改版本号0.0.1
js 复制代码
yarn init -y
  • 初始化git,用来作为版本控制git init,并且添加.gitignore
bash 复制代码
# 忽略依赖模块目录
node_modules/

# 忽略本地构建/临时文件目录
build/
temp/
dist/

# 忽略配置文件
config.js
config.json

# 忽略编辑器生成的文件和目录
.vscode/
.idea/
*.swp

# 忽略日志文件
logs/
*.log

# 忽略敏感信息(例如,API 密钥)
.env

# 忽略自动生成的文档
doc/
docs/
*.html
*.pdf

# 忽略特定文件
file-to-ignore.txt

# 忽略特定目录及其内容
directory-to-ignore/

# 忽略 Mac OS X 上的隐藏文件
.DS_Store

# 忽略 Windows 上的 Thumbs.db 文件
Thumbs.db
  • 创建src存放源代码,并新建main.ts,命令行ts-node-dev src/main.ts能成功运行
js 复制代码
console.log('test')
  • 在package.json创建快速启动,之后直接运行yarn start即可
ts 复制代码
"scripts": {
  "start": "ts-node-dev src/main.ts"
}
  • 安装commander.js

    • yarn add commander@3.0.2
  • 右键新建cli.ts用于处理命令行,

ts 复制代码
#! /usr/bin/env node
import * as commander from 'commander';
import { translate } from './main';

const program = new commander.Command()

program.version('0.0.1')
  .name('fy')
  .usage('<English>')
  .arguments('<English>')
  .action(function (english) {
    translate(english)
  })

// 通过 program.parse(process.argv); 来解析实际的命令行参数,process.argv 包含了 Node.js 进程的命令行参数。
program.parse(process.argv);
  • 新建main.ts写上翻译的逻辑
ts 复制代码
import * as querystring from 'querystring';
import * as https from 'https';
const crypto = require('crypto');
export const translate = (word) => {
// 请求参数
  const appId = '???';
  const appSecret = '???'; 
  const query = word;
  const fromLanguage = 'en';
  const toLanguage = 'zh';
  const salt = Math.random();

  // 计算签名(MD5加密)
  const sign = crypto.createHash('md5').update(appId + query + salt + appSecret).digest('hex');

// 构建请求参数
  const params = {
    q: query,
    from: fromLanguage,
    to: toLanguage,
    appid: appId,
    salt: salt,
    sign: sign
  };

// 将请求参数编码成查询字符串
  const queryString = querystring.stringify(params);

// 构建请求选项
  const options = {
    hostname: 'api.fanyi.baidu.com',
    path: '/api/trans/vip/translate?' + queryString,
    method: 'GET'
  };

// 发送请求
  const req = https.request(options, (res) => {
    let data = '';

    res.on('data', (chunk) => {
      data += chunk;
    });

    res.on('end', () => {
      console.log(data);
    });
  });

  req.on('error', (error) => {
    console.error('请求出错: ' + error.message);
  });

  req.end();


}

五. 如何处理appId和Secret

  • 一般来说,创建一个文件叫做private.ts,并在git中忽略
ts 复制代码
// private.ts导出
export const appId = '20200426000430230';
export const appSecret = 'N8pi1gg86hxPLIdvh7n0';


// main.ts中引入
import { appId, appSecret } from './private';
  • 将简写的res,req写全,并且将获得的翻译数据转成json
ts 复制代码
// 发送请求
  const request = https.request(options, (response) => {
    let data = '';

    response.on('data', (chunk) => {
      data += chunk;
    });

    response.on('end', () => {
      console.log(data);
      const object = JSON.parse(data)
      console.log(object)
    });
  });

  request.on('error', (error) => {
    console.error('请求出错: ' + error.message);
  });

  request.end();
  • 根据文档给object定义类型,并且打印出翻译
ts 复制代码
type BaiduResult = {
  error_code?: string;
  error_meg?: string;
  from: string;
  to: string;
  trans_result: { src: string; dst: string; }[]
}
response.on('end', () => {
    console.log(data);
    const object: BaiduResult = JSON.parse(data)
    console.log(object)
    console.log(object.trans_result[0].dst);
  });

六. 继续完善功能

  • 加上处理错误的逻辑和退出进程代码
ts 复制代码
response.on('end', () => {
    const object: BaiduResult = JSON.parse(data)
    if(object.error_code) {
      console.error(object.error_msg)
      process.exit(1)
    } else {
      console.log(object.trans_result[0].dst);
      process.exit(0)
    }
  });
  • 增加中译英功能,通过正则实现
ts 复制代码
  let fromLanguage, toLanguage
  if(/[a-zA-Z]/.test(word[0])) {
    fromLanguage = 'en';
    toLanguage = 'zh';
  } else {
    fromLanguage = 'zh';
    toLanguage = 'en';
  }

七. 开始准备发布

  • 确定命令行,package.json中添加命令,但是这个时ts文件,只能通过ts-node-dev来运行
    • 我们需要把ts编译成js
json 复制代码
  "bin": {
    "fy": "src/cli.ts"
  },
  • 通过tsc编译把ts项目编程js
    • 先运行tsc --init,会多一个tsconfig.json文件,然后修改此文件
csharp 复制代码
tsc --init
  • 把代码放到dest目录
json 复制代码
  "outDir": "dist/"
  • 需要注意不能直接运行tsc,需要运行tsc -p .,把当前目录当成一个项目

  • 给cli.ts加一个shebang,指明编译后的文件需要用nodejs来运行

js 复制代码
#! /usr/bin/env node
  • 在package.json中写明需要发布的文件
json 复制代码
  "main": "dist/main.js",
  "bin": {
    "fy": "dist/cli.js"
  },
  "files": [
    "dist/**/*.js"
  ],
  • 开始上传
perl 复制代码
nrm use taobao
npm addUser
npm publish
  • 上传之后安装一下看一下是否能够使用

八. 对比一下其它优秀的案例

  • 参考一下,自己可以完善一些其它功能
csharp 复制代码
yarn global add fanyi
fanyi apple
fanyi 键盘
// 如果不行的话 尝试运行npx fanyi apple
相关推荐
程序员Sunday3 小时前
JavaScript 闭包是什么?为什么变量没有被释放,什么时候会内存泄漏?
前端·javascript
JarvanMo3 小时前
Flutter 终于有自己的 React Flow 了,vyuh_node_flow 上手实录
前端
狂师3 小时前
爆火!新一代e2e AI测试框架,单日狂揽1500 star
前端·人工智能·测试
西瓜很甜哟3 小时前
golang实现大文件分片上传
后端·golang·html
恋猫de小郭3 小时前
Flitz ,一个把 Flutter 玩成热插拔 Preview 的有趣项目,不错的思路
android·前端·flutter
闭包不眠3 小时前
Word转HTML后体积不对,裁掉的截图原图还在
前端·图像处理·人工智能·计算机视觉·html·word
言乐63 小时前
PythonLOLM自动生成复盘报告模型
开发语言·前端·数据库·人工智能·python
tryCbest3 小时前
第二篇:CSS3 全部知识点全解 + 项目样式实现
前端·css·css3
sp42a3 小时前
简单的 Spring 文件上传与下载组件
java·后端·spring
一木 之林3 小时前
Agent智能体学习总结:从一次调用到模型自主规划、工具调用与 ReAct 循环的项目实战-6/6
前端·人工智能·学习·react.js