• npm从git地址安装
    npm install –save git+ssh:// 项目中模块依赖的地址也会被改成git地址
  • 怎样停止监听端口
    1
    2
    3
    var server = http.createServer();
    server.listen(...);
    server.stop(); // 停止监听

website

product

  • koa2-remote
  • md-hexo
    • 为markdown文件增加title和tags,date标签
    • 默认忽略node_modules目录

filename: 当前文件路径
module.filename 等同于
filename
__dirname: 当前文件所在文件夹
process.cwd() 执行当前命令所在的目录
require.main.filename 用node启动的module的filename,如 node xxx,这里的filename就是这个xxx。
require()方法的坐标路径是:module.filename;fs.readFile()的坐标路径是:process.cwd()。

背景

在一个electron项目中,需要引入一些模板文件,之前处理一直是require引入后使用webpack进行打包.. 但是既然是electron环境,支持node,为什么就不能让node的require直接引入模板文件呢?实际上就是不想打包, 不想在支持node的环境中使用webpack.. so,开始折腾

解决

相关资料

koa@next的中间件不需要一定是generate函数.
这点非常重要, 这样我编写一个小插件就不需要babel转换了,例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// npm install koa@next
var koa = require('koa');
var app = new koa();
app.use(function (ctx, next) {
if(!ctx.response.body) {
ctx.response.body = 'not fount';
}
return next();
});
app.listen(3000, function(err) {
err && console.log(err) || console.log('start server at http://localhost:3000');
});

相对于父元素宽度的:
[max/min-]width、left、right、padding、margin 等;

相对于父元素高度的:
[max/min-]height、top、bottom 等;

相对于继承字号的:
font-size 等;

相对于自身字号的:
line-height 等;

相对于自身宽高的:
border-radius、background-size、transform: translate()、transform-origin、zoom、clip-path 等;

特殊算法的:
background-position(方向长度 / 该方向除背景图之外部分总长度 * 100)、
filter 系列函数等;

如果自身设置 position: absolute,“父元素”指:破坏文档流的div高度设为百分比是相对谁而言的? - Boringer 的回答
如果 position: fixed,“父元素”指视口。

作者:Boringer
链接:https://www.zhihu.com/question/36079531/answer/65809167
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

css3

position: sticky;
position: -webkit-sticky;

滚动定位: 当页面元素滚动到视觉范围之外时,元素改为fixed定位

ios滚动时事件处理

ios滚动时无触发scroll事件:可以修改为绑定touchmove事件,但是滑动后惯性滚动时还是不会触发事件
ios滚动时position从fixed切换为relative会有问题, 可以使用css3

mac同一程序不同窗口切换快捷键

commond + ~

webstrom format不工作

原因: 插件失效

shell

  • 获取日期时间 d=date '+%Y-%m-%d %H:%M:%S'
  • 使用expect实现自动交互功能
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # expect 示例1
    #! /usr/bin/expect
    expect << EOF
    spawn python upload.py -y
    expect "username:"
    send "myusename\r"
    expect "password:"
    send "mypassword\r"
    expect "New issue subject:"
    send "issuename\r"
    expect eof
    exit
1
2
3
4
5
6
7
8
9
# expect 示例2
spawn python upload.py -y
expect {
"username:" { send "myusename\r"; exp_continue}
"password:" { send "mypassword\r"; exp_continue }
"New issue subject:" {send "issuename\n"; exp_continue}
"please visit" {exit}
}

TCL (工具命令语言(Tool Command Language))

node错误处理

shell脚本 条件判断错误

[shell脚本报错:”[: =: unary operator expected”](http://blog.csdn.net/goodlixueyong/article/details/6564591)
在匹配字符串相等时,我用了类似这样的语句:

1
2
3
if [ $STATUS == "OK" ]; then
echo "OK"
fi

在运行时出现了 [: =: unary operator expected 的错误,就一直找不到原因,尝试了删除等号两侧的空格和括号里的空格都不管用,最后baidu了一下,才找到原因。把语句改成这样就不会出错了.

1
2
3
if [[ $STATUS = "OK" ]]; then
echo "OK"
fi

究其原因,是因为如果变量STATUS值为空,那么就成了 [ = “OK”] ,显然 [ 和 “OK” 不相等并且缺少了 [ 符号,所以报了这样的错误。当然不总是出错,如果变量STATUS值不为空,程序就正常了,所以这样的错误还是很隐蔽的。

或者用下面的方法也能避免这种错误:

1
2
3
if [ "$STATUS"x == "OK"x ]; then
echo "OK"
fi

当然,x也可以是其他字符。顺便提一点,shell中有没有双引号在很多情况下是一致的。

node同一个端口支持http和https(只能作为服务器,不能作为代理)

摘自:http://www.cnblogs.com/dojo-lzz/p/5479870.html
众所周知node是一个高性能的web服务器,使用它可以很简单的创建一个http或https的服务器。
比如一个很简单的http服务器:

1
2
3
4
5
6
7
8
9
var http = require('http');
var https = require('https');
var httpPort = 3345;
var server = http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('hello world!');
}).listen(httpPort);

https服务器需要生成证书,详情请看这篇文章:HTTPS 的原理和 NodeJS 的实现。这里我们直接看最终成果,附件证书。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var https = require('https');
var fs = require('fs');
var httpsPort = 3346;
var options = {
key: fs.readFileSync('./cakey.pem'),
cert: fs.readFileSync('./cacert.pem')
};
var sserver = https.createServer(options, function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('secured hello world');
}).listen(httpsPort);

从上文我们可以看出,node生成的每个服务器必须分配一个端口。那么如果我们在工作中遇到一个需求:让同一个端口或地址既支持http协议又支持https协议,这时候我们该怎么办,有的同学很可能想到用nginx做反向代理,这不失为一个解决方案,但这也同样意味着增加了产品的复杂度,用户并不想去折腾ngnix。
办法是有的,原理就要搬出OSI的七层模型:
a8ec8a13632762d04284e772a1ec08fa503dc641
HTTP与HTTPS都属于应用层协议,所以只要我们在底层协议中进行反向代理,就可以解决这个问题! 刚好node可以让我们很方便的创建一个tcp服务器!

所以我们的核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
var net = require('net');
var http = require('http');
var https = require('https');
var fs = require('fs');
var httpPort = 3345;
var httpsPort = 3346;
var server = http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('hello world!');
}).listen(httpPort);
var options = {
key: fs.readFileSync('./cakey.pem'),
cert: fs.readFileSync('./cacert.pem')
};
var sserver = https.createServer(options, function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('secured hello world');
}).listen(httpsPort);
net.createServer(function(socket){
socket.once('data', function(buf){
console.log(buf[0]);
// https数据流的第一位是十六进制“16”,转换成十进制就是22
var address = buf[0] === 22 ? httpsPort : httpPort;
//创建一个指向https或http服务器的链接
var proxy = net.createConnection(address, function() {
proxy.write(buf);
//反向代理的过程,tcp接受的数据交给代理链接,代理链接服务器端返回数据交由socket返回给客户端
socket.pipe(proxy).pipe(socket);
});
proxy.on('error', function(err) {
console.log(err);
});
});
socket.on('error', function(err) {
console.log(err);
});
}).listen(3344);