npm介绍
npm(Node Package Manager)是Node.js的包管理器,提供了很多可以重用的模块
使用npm
安装模块
1 | // 本地安装 安装在对应的项目下,会生成一个.node_modules的目录 |
下载下来之后就可以在node.js中使用该模块了
1 | // module为对应模块的名称 |
搜索模块
1 | // 可以搜索对应的模块 |
查找对应的文档
1 | // 可以查看对应模块的文档 |
npm(Node Package Manager)是Node.js的包管理器,提供了很多可以重用的模块
1 | // 本地安装 安装在对应的项目下,会生成一个.node_modules的目录 |
下载下来之后就可以在node.js中使用该模块了
1 | // module为对应模块的名称 |
1 | // 可以搜索对应的模块 |
1 | // 可以查看对应模块的文档 |
CSS语法结构由3部分组成:选择符、属性和值
Selector {Property : Value}
多个标签之间使用逗号隔开
1 | h1,h2,h3,h4 { |
当一个标签嵌套在另一个标签中,想要精准的设置该样式,需要先列出上层标签,在列出子标签,中间使用空格隔开
1 | ol ul { |
可是使用class来对样式进行分类,以点开头+class名称进行设置
1 | .new { |
使用该样式,只需要设置标签的class为new即可
1 | <li class="new">测试 </li> |
除了可以使用class外,还可以使用id,以井号开头+id值进行设置
1 | #special { |
使用该样式,只需要设置标签的id为special即可
1 | <li id="special">测试 </li> |
如果既想使用id或class,又想同时使用标签,可以使用如下格式
1 | // 针对id为content的h1标签 |
1 | // h1标签下的所有class为p1的标签 |
List属于单值多value,链表用的是双向链表结构,list支持pop、push来操作头部和尾部,既可以用做栈也可以用做队列
在3.2版本之前使用的是ziplist和linkedlist,在3.2版本之后使用的是quicklist
由于linkedlist的附加空间相对太高,prev和next指针就要占去16个字节,而且每个节点的内存都是单独分配,加剧了内存的碎片化,使用quicklist来代替之前的ziplist+linkedlist
1 | typedef struct quicklist { |
看代码好像底层还是使用的ziplist,而且还有前驱和后继指针,就是一个ziplist+linkedlist混合体,把多个ziplist使用双向指针串联起来了。
默认单个ziplist长度为8字节,使用 list-max-ziplist-size
来进行配置
1 | # For a fixed maximum size, use -5 through -1, meaning: |
linux中有几种IO模型,如select、poll、epoll,这几个分别是什么呢?
在select模型下是利用轮询socket句柄的方式来实现监测socket中是否有IO数据到达,每次调用select,都需要把fd集合从用户态拷贝到内核态,然后在内核态还要遍历一遍传进来的所有fd,在fd很多时开销很大
select默认支持的文件描述符是1024
poll模型与select类似,不过其是基于链表存储的,没有最大连接数限制,但是跟select一样,需要把fd集合在用户态和内核态之间来回复制
epoll改进了轮询socket句柄的方式,采用notify机制来进行监测,为每个fd指定一个回调函数,当设备就绪,唤醒等待队列上的等待者,就会调用这个回调函数