- 什么是命令行
- 命令行的优势
- 命令行如何工作
- NodeJS下的命令行程序
- 撰写NodeJS的命令行程序
- 发布NodeJS包
什么是命令行
1:人脑 > 消息器官>交互接口>操作系统>计算机> 操作系统> 交互接口> 感官 > 人脑
2:一种基于文本流的用户交互接口和交互方式
命令行的优势
1: 单一目标、协同工作、通用接口 简洁、高效、操作易保存和传播
#!/bin/sh
cat data.txt | sort | uniq -c | sort -n -r | head 108 > top_data.txt
命令行如何工作
1: shebang
2:命令解释程序
3: $PATH搜索
NodeJS下的命令行程序
多版本切换 n/nvm
sudo n latest
n
n nvm
npm安装 Y N
脚本安装 Y Y
修改PATH N Y
替换系统路径 Y N
切换效率 稍低 高
windows方案 wsl/cgwin wsl/cgwin/nvm-win
开发脚手架 vue-cli/create-react-app/ng-cli
1:通过简单、标准化的命令,快速搭建一个符合预设的项目骨架
2: 在符合预设的基础上,通过npm scripts透明化开发、构建、部署、测试等任务
v c n
官方背景 Y Y Y
接管流程 开发/构建/部署/测试 开发/构建/部署/测试 开发/构建/部署/测试/文档
定制化途径 问答、定制preset npm安装 问答、ng子命令
生成代码语言 Javascript Javascript Typescript
可配置性 中 强 弱
配置易用性 强 中 中强
预编译与打包 babel/webpack
babel.config.js与.babelrc
- 目的都是配置presets和plugins
- babel.config.js在根目录,.babelrc在各级目录都可以有
- 只要有了babel.config.json, 下面各级的.babelrc都失效
- .babelrc:最近的配置覆盖原则
- babel.config.js的意义:给配置一个编程生成的机会
plugins/presets
- 先运行plugin,后运行preset
- plugin按配置顺序运行
- preset按配置反序运行
- 先小后大,小正大反
{
"plugins": ["transform-decorators-legacy", "transform-class-properties"],
"presets": ["es2015", "react", "stage-2"]
}
loader和plugin的区别
webpack-dev-server
- 支持命令行和webpack配置两种方式
- 底层采用express建立web server
- 可以指定port/hosts
- 模块热替换 HotModuleReplacement
常见优化手段
- 全局化第三方库:externals
- 分层级划分项目公用库:ProvidePlugin/CommonsChunkPlugin
- 按需加载:require.ensure
执行辅助 nodemon/npx
- Nodemon运行,修改代码无需重启
- 除了监控NodeJS,还可监控其他语言程序
npx http-server
npm scripts
- 内置钩子
- 自定义脚本
SemVer
x.y.z
x:主版本号:不向下兼容的新功能
y:次版本号:向下兼容的新功能
z:修订号:向下兼容的修正
=~^>
1.0.0-alpha
1.0.0-alpha.1
1.0.0-alpha.beta
1.0.0-beta
1.0.0-beta.2
1.0.0-beta.11
1.0.0-rc.1
1.0.0
SemVer
- 用连接号连接修订号和标识号
- 不许空格,不许加前导零
- 用“.”分割各段
- 只有数字比数值,否则比ascii码
- 最后看谁点多
撰写NodeJS的命令行程序
- 命令参数读取 commander
- 进度条 progress
- 交互着色 chalk
- 交互式问答 inquirer
- loading中的小图标ora
- 命令行玩浏览器 puppeteer
- ThinkJS VS CMD
命令参数读取 commander
var program = require('commander');
program
.version('0.1.0')
.option('-p, --peppers', 'Add peppers')
.option('-P, --pineapple', 'Add pineapple')
.option('-b, --bbq-sauce', 'Add bbq sauce')
.option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
.parse(process.argv);
console.log('you ordered a pizza with:');
if (program.peppers) console.log(' - peppers');
if (program.pineapple) console.log(' - pineapple');
if (program.bbqSauce) console.log(' - bbq');
console.log(' - %s cheese', program.cheese);
命令参数读取 commander
用户的每一个输入,都会放置在program对应option长名的字段的驼峰形式上,如果没有提供长名,则放在短名字段上
命令参数读取 commander
var program = require('commander');
program
.version('0.1.0')
.command('install [name]', 'install one or more packages')
.command('search [query]', 'search with optional query')
.command('list', 'list packages installed', {isDefault: true})
.parse(process.argv);
进度条 progress
const ProgressBar = require("progress")
...
const bar = new ProgressBar(
'下载中: ├:bar┤ 完成:percent 预估完成时间:eta秒 用时:elapseds',
{
total: 100,
complete: "█",
incomplete: "─",
width: 60
})
...
let progressFix = ((state.percent) * 100).toFixed(2)
delta = progressFix - percent
bar.tick(delta)
交互着色 chalk
交互式问答 inquirer.js
loading中的小图标ora
命令行玩浏览器 puppeteer
寻找你的包
npmjs.org 搜索
https://github.com/sindresorhus/awesome-nodejs
发布NodeJS包
1: mkdir jjsnc-test
2: cd jjsnc-test
3: npm init (选择MIT 格式)
4:: npm adduser 输入npm 账号密码
5: npm publish
发布带有命名空间的包