npm gitbook 文档编辑生成器
first step : npm install -g gitbook-cli
second step : gitbook init
third step: gitbook serve (and your application is running on port 4000)
npm gitbook 文档编辑生成器
first step : npm install -g gitbook-cli
second step : gitbook init
third step: gitbook serve (and your application is running on port 4000)
nodejs 流对象操作 记录
自定义可写流
const {Writable} = require('stream')
class CounterStream extends Writable {
constructor(options){
super(options)
this.counter = 0
}
_write(chunk , encoding, callback){
console.log(chunk.toString("utf-8"))
this.counter+=chunk.length
callback.call()
}
}
module.exports = CounterStream
关键在于继承stream.Writeable 并且重写 _write(chunk , encoding, callback)
自定义可读流
const {Readable} = require('stream')
class MyReadableStream extends Readable {
constructor(options){
super(options)
this.isFinished = false
}
_read(size){
//待处理数据放在this._buffer中
if(!this.isFinished){
this.push("abc123")
this.isFinished = true
}else{
this.push(null)
}
}
}
module.exports = MyReadableStream
关键在于继承stream.Readable 并且重写 _read(size)
_read 方法中要把数据放到this.push的方法中 且 没有数据读取时 this.push(null) 结束读取
可以从Readable.pipe(Writable) 使用管道的方式 从可读流读取数据 pipe 到可写流中
注意 该方法为异步方法
特殊的流 socket 为双向流 可读可写
process.stdin 标准输入流
process.stdout 标准输出流
process.stderr 标准异常流
把标准输入流输出到标准输出流
const stdin = require('process').stdin
const stdout = require('process').stdout
const stderr = require('process').stderr
stdin.pipe(stdout)
执行后 主线程阻塞 读取标准输入流 读取到数据后 在 标准输出流输出
输入流事件有以下几个
输出流事件
pm2 负载均衡
pm2 start app.js -i 4
以1个主进程监听端口 4个副进程 处理nodejs请求进程
pm2 start app.js -i max
以cpu核心的数量处理nodejs请求进程
pm2 其实是利用nodejs cluster模块运行
查看http://nodejs.cn/api/cluster.html
单个 Node.js 实例运行在单个线程中。 为了充分利用多核系统,有时需要启用一组 Node.js 进程去处理负载任务。
cluster
模块可以创建共享服务器端口的子进程。
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`主进程 ${process.pid} 正在运行`);
// 衍生工作进程。
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`工作进程 ${worker.process.pid} 已退出`);
});
} else {
// 工作进程可以共享任何 TCP 连接。
// 在本例子中,共享的是 HTTP 服务器。
http.createServer((req, res) => {
res.writeHead(200);
res.end('你好世界\n');
}).listen(8000);
console.log(`工作进程 ${process.pid} 已启动`);
}
$ node server.js
主进程 3596 正在运行
工作进程 4324 已启动
工作进程 4520 已启动
工作进程 6056 已启动
工作进程 5644 已启动
小程序 公众号 等多端开发 nodejs框架
pm2 为nodejs 进程管理器 为某个nodejs进程提供守护进程功能
npm install -g pm2 全局安装
pm2 start app.js 替代 node app.js 以守护进程启动app.js
pm2 start app.js –name wb123 以守护进程启动app.js 并命名为wb123
pm2 start bin/www –watch 以守护进程启动bin/www 并监控文件变化自动重启
pm2 restart wb123 重启wb123服务
pm2 stop wb123 停止服务 pm2 stop all 停止所有
pm2 delete www 删除www服务 pm2 delete all 删除所有
pm2 list 查看所有进程
pm2 monit 查看进程内存等
pm2 -h 查看命令详细
pm2 启动其他进程 在当前文件写下一个 xxx.json的脚本
pm2 start xxx.json 执行
脚本内容如下
{
"name": "应用进程名称",
"args": "传递给脚本的参数",
"script": "启动的脚本路径",
"exec_interpreter": "指定的脚本解释器",
"exec_mode": "fork",
"max_memory_restart": "100M",
//其它参数
"watch": [ // 监控变化的目录,一旦变化,自动重启
"bin",
"routers"
],
"ignore_watch" : [ // 从监控目录中排除
"node_modules",
"logs",
"public"
],
"watch_options": {
"followSymlinks": false
},
"error_file" : "./logs/app-err.log", // 错误日志路径
"out_file" : "./logs/app-out.log", // 普通日志路径
"env": {
"NODE_ENV": "production" // 环境参数,当前指定为生产环境
}
}
php脚本
{
"name": "php-socket",
"args": "",
"script": "./include/Socket.php",
"exec_interpreter": "php.exe",
"exec_mode": "fork",
"max_memory_restart": "100M"
}
java jar包
{
"name": "my-server",
"script": "/usr/bin/java",
"args": [
"-jar",
"server.jar"
],
"exec_interpreter": "",
"exec_mode": "fork"
}
{
"name": "yhtAdmin",
"script": "java",
"args": [
"-jar",
"background-0.0.1-SNAPSHOT.jar"
],
"error_file":"./log/err.log",
"out_file":"./log/out.log",
"exec_interpreter": "",
"exec_mode": "fork"
}
一次写码,多端运行的框架
一套不错的前端框架 但貌似不太适合用在移动端 服务端也没有elementUI好 ,组件介乎移动端和pc端之间,比较好的点在于与nuxt结合得比较好,可以可快速开发
一套很不错的移动端vue框架和vant齐名
基于vue的移动端开发组件库(有赞)
其实就是执行kibana项目下的package.json的build命令,默认是打包三个平台的压缩包。具体执行流程在kibana / src / dev / build / build_distributables.js这个文件,分为环境验证,环境下载(nodejs下载这个地址在国外,可以手动改为国内地址),执行对应环境的npm初始化,下载dependencies。执行编译、打包(压缩包)。最后是sha码验证。前几步其实执行了一次后可以跳过。重要的是 后面的编译打包。