css 媒体查询
css 媒体查询
在写媒体查询的时候,顺序很重要。
- min 相关的,必须从上到下的值依次递增。
- max 相关的,必须从上到下的值依次递减。
原因:相同的权重,最后一条被选中。比如现在宽度 750px,能匹配到第一条和第三条,最小值 700px–最大值 800px
1 | @media screen and (min-width: 700px) { /* 依次递增 */ |
在写媒体查询的时候,顺序很重要。
原因:相同的权重,最后一条被选中。比如现在宽度 750px,能匹配到第一条和第三条,最小值 700px–最大值 800px
1 | @media screen and (min-width: 700px) { /* 依次递增 */ |
首先要说的是 animation-timing-function。这个东西经常被放在定义 animation 的类中,如:
1 | .bar { |
根据 MDN:
Timing functions may be specified on individual keyframes in a @keyframes rule. If no animation-timing-function is specified on a keyframe, the corresponding value of animation-timing-function from the element to which the animation is applied is used for that keyframe. https://developer.mozilla.org/en-US/docs/Web/CSS/animation-timing-function
就是说这个东西本来应该是定义在单独的帧中的,表示这个帧开始到下一个帧开始这段时间的时间函数。如果帧中没定义这个 timing-function,那么就会用类中定义 animation 时候的函数,如上面就是 steps (1, end)。只能说,咱们中国人翻译外文时,都不仔细啊,搞得自己在中文各大网站上都没看到过在帧中使用时间函数的例子。直到看到了 Animate.css (https://github.com/daneden/animate.css/blob/master/animate.css)。 今天说一下 css3 的 animate 吧。这两天的学习还是小有所得。将根据几个例子来讲解。准备把 animation 的东西都讲一遍哈。
Node.js 的单个实例运行在单线程中。要利用多核,需要开启 node.js 进程的集群,来处理负载。使用 cluster 模块,很容易创建共享 server 端口的子进程。
1 | const cluster = require('cluster'); |
worker 子进程是使用 child_process.fork 生成的,所以子进程可以通过 IPC 通道和父进程往返传递 server 句柄。
cluster 支持两种分发请求方式:
第二种方案,讲道理应该是性能最优的,但由于操作系统的调度不可预测,会导致负载极其不均。假设 8 个进程,会出现 2 个进程占据了 70% 的请求的情况。
因为 server.listen () 把大部分工作都扔给了主进程,普通的 Node.js 进程和集群的进程有 3 种 case 不一样:
该模块暴露了 2 个组件:
1 | const output = fs.createWriteStream('./stdout.log'); |
log/assert/count/countReeset/debug/dir/dirxml/error/group/info/table/time/timeEnd/trace/warn 等。
v9.3.0 中,console.debug is now an alias for console.log.
fs 模块提供了接近于标准 POSIX 函数与文件系统交互的 API 接口。
所有 api 均提供了同步和异步的方式。
异步的方式,最后一个参数接收一个完成时回调函数,传递给该回调的参数取决于方法,但第一个参数总是一个异常值。如果操作成功执行,第一个值就是 null 或者 undefined。
使用同步方法产生的异常,可以用 try/catch 捕获,或者让其冒泡。
使用异步方法不能保证谁先完成。如果对时序有要求,需要将其他代码放入回调中。
在复杂的进程中,优先考虑异步方法。同步的会 block 住主进程,直到它们完成。
大多数的 fs 操作接收这些形式的文件路径:字符串,Buffer,使用 file: 协议的 URL 对象。
字符串形式的路径被解释为 UTF8 字符序列,可标识绝对或者相对路径。相对路径会相对于当前工作目录(proceess.cwd ())。其他两种形式的 path 不做介绍。
## 文件描述符
在 POSIX 系统上,对于每一个进程来说,内核维护了一张表示当前打开的文件和资源的数据表。每一个打开的文件被赋予了一个简单的数字标志符,称为文件描述符 fd。在系统级别,所有文件系统的操作都使用那些 fd 来识别、追踪具体文件。Windows 操作系统使用了一种不一样,但概念上相似的机制来追踪资源。为了方便使用者,Node.js 抽象了在不同平台的差异,都通过分配一个数字 fd 来标志打开的资源。
fs.open () 方法用来分配一个新的文件描述符(后文统称为 fd)。一旦分配好了,该 fd 可能被用于从文件中读取数据、写入输入或者获取关于文件的信息等。
1 | fs.open('/open/some/file.txt', 'r', (err, fd) => { |
大多数的操作系统限制 fd 的数量,因为它会在任意时间打开,所以当操作完毕的时候,需要及时关闭 fd。不这样做的话,会导致内存泄露,最终让应用拉闸。
除 fs.FSWatcher () 之外的所有文件系统 API 以及明确的同步文件系统 API,它们都使用 libuv 的线程池,这对某些应用程序可能会产生令人惊讶的负面性能影响。有关更多信息,请参阅 UV_THREADPOOL_SIZE 文档。
V10.10 新增,当 fs.readdir 或者同步方法以 withFileTypes: true 调用时,返回的结果不再是字符串或者 Buffers,而是 fs.Dirent 对象。
是否是块设备。
文件名。与 encoding 有关。
成功的 fs.watch () 调用会返回一个 fs.FSWatcher 对象。当监控的文件发生变化后,‘change’事件会被触发。
当监控的目录或者文件发生变化时触发该事件。
V10.0 新增,当 watcher 停止监听变化时触发。
当在监听一个文件时出错后出发。
停止监听变化。一旦停止,fs.FSWatcher 对象不再可用。(close、error 事件同样)
成功的 fs.createReadStream () 调用会返回一个 fs.ReadStream 对象。所有 fs.ReadStream 对象都是可读流。
当 fs.ReadStream 的底层 fd 被关闭时触发。
当 fs.ReadStream 的 fd 被打开时触发。
当 fs.ReadStream 可以使用时触发。在’open’触发之后立即触发。
到目前为止读取了的字节数。
传递给 fs.createReadStream () 的第一个参数。
v11.2 新增
如果底层 fd 还没有打开,会返回 true。比如,在’ready’事件被触发前。
一个 fs.Stats 的对象提供关于一个文件的信息。
调用 fs.stat/lstat/fstat 以及同步方法返回的对象是 fs.Stats 的实例。如果 options 中的 bigint 被设为 true,那么数字值将会是 bigint 而不是 number。
包含文件的设备的数字标志符。
文件系统具体的’Inode’数量。
比特位的描述文件类型及权限。
硬链接到该文件的数量。
文件的拥有者 id、组 id
文件的总大小(字节)。
文件最后一次访问的毫秒时间。
文件最后一次修改的毫秒时间。
文件状态最后一次被修改的的毫秒时间。
文件的创建时间。
同上。但是返回一个 Date 对象。
可写流。
以指定 mode 来测试用户对于一个给定 path 的文件或者目录的权限。mode 参数是一个可选的整数,它指定了要检查的具体权限。可以用或运算符来添加多个要检查的权限。比如 (fs.constants.W_OK | fs.constants.R_OK)
最后一个参数,callback,以一个 err 为参数的回调。如果检查中出现任何错误,err 就是 Error 的对象。否则为 null 或者 undefined。
1 | const file = 'package.json'; |
在 fs.open/readFile/writeFile 之前使用 fs.access 来检查可访问性是不推荐的。这样做会导致竞态出现:两个操作之间可能有其他处理改变了文件的状态。相反,用户应该直接使用 open/readFile/writeFile 等方法,在回调中去检查文件是否可访问。
通常来说,只有当不直接使用文件时,才会使用 fs.access 来检查可访问性。比如,一个文件是否存在,作为一个开关控制程序的运行。
Windows 上,目录的访问控制政策 access-control policies (ACLs) 也许限制访问文件或者目录。然而 fs.access 函数并不检查 ACL,因此也许会返回该路径可访问的状态,即使 ACL 限制了用户读取或者写入。
无返回值。如果有错,会 throw 一个错误。需要 try、catch 捕获。
1 | try { |
异步地增加数据到一个文件。如果文件不存在则创建。
同样用 try/catch 捕获错误。
改变一个文件的权限。
mode 参数被 fs.chmod 和 fs.chmodSync 方式使用。
Constant | Octal | Description |
---|---|---|
fs.constants.S_IRUSR | 0o400 | read by owner |
fs.constants.S_IWUSR | 0o200 | write by owner |
fs.constants.S_IXUSR | 0o100 | execute/search by owner |
fs.constants.S_IRGRP | 0o40 | read by group |
fs.constants.S_IWGRP | 0o20 | write by group |
fs.constants.S_IXGRP | 0o10 | execute/search by group |
fs.constants.S_IROTH | 0o4 | read by others |
fs.constants.S_IWOTH | 0o2 | write by others |
fs.constants.S_IXOTH | 0o1 | execute/search by others |
关闭 fd。
返回一个只包含文件系统操作的常量对象。定义在 FS Constants (见官网).
默认上,dest 如果已经存在,会覆盖。Node.js 不保证复制操作的原子性。如果在已打开 dest 文件准备写入而发生错误,Node.js 会尝试清除 dest 文件。
flags 是个可选的整型,它指定了复制操作的行为。可以使用 OR 来包含更多标志位。(e.g. fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE)
1 | const fs = require('fs'); |
不像 readable stream 一样默认的 16kb highWaterMark 值,该返回的 stream 默认为 64kb。
opions 中的 start 和 end 可以读取某个范围内地数据,而不是整个文件。start 和 end 都是包含临界点地数据,同时以 0 为开始。如果 fd 指定了,start 忽略了,fs.createReadStream 会从文件的当前位置开始读取。如果 fd 指定了,ReadStream 会忽略 path 参数而使用具体的 fd。这意味着将没有 open 事件触发。fd 应该是阻塞的;非阻塞的 fd 应该传递给 net.Socket.
如果 fd 指向了只支持阻塞读取的字符设备,比如键盘或者声卡,在数据可用之前,读操作不会完成。这避免了进程退出和流关闭。
1 | const fs = require('fs'); |
和 chomd 差不多,不过第一个参数不是 path 了,而是 fd。
刷新对该 fd 的内核数据到外部永久介质上。
fdatasync 函数类似于 fsync 函数,但它仅仅影响文件数据部分。
缩短文件到指定 len 长度。
与 stat 差不多。不过,如果 path 是一个 link 的话,它返回该 link 的信息,而不是该 link 所指向的文件。
创建一个唯一的临时文件夹。
返回一个 fd。
读取目录的内容。若 encoding 为’buffer’,则 files 为 Buffer []; 若 withFileTypes 为 true,则 files 为 fs.Dirent []。
读取 link 文件的信息。
学而时更之,不亦乐乎
版本:V11.10 LTS
Note: 内容主要以个人基础为起点,只记录了个人认为需要的东西。官网
v8 新增。用于监测所有异步操作。目前处于实验阶段。
返回当前环境上下文的 ID。
返回触发当前代码执行的环境上下文 ID。比如,在一个 Tick(环境 ID 假设为 1)中执行了异步操作 A,那么 A 的 triggerId 就是 1。
创建一个 Hook 实例 hook,callback 是个回调对象,可包含 init/before/after/destroy/promiseResolve。__NOTE__:由于 console.log 在 Nodejs 中也是异步操作,因此不能在各个回调中使用 log 来打印信息,会无限循环。常见的采用写文件方式。关于 console.log 是异步的验证,如下代码:
1 | const asyncHooks = require('async_hooks'); |
会输出:
1 | true |
然后代码中去掉最后两行 log,输出:
1 | true |
发现,console.log 的调用过程存在异步的调用(关于 process.stdout 是异步还是同步,process 一节有说明,但我觉得不能解释这个 console.log 是异步 TODO)
根据文档及我的理解,executionAsyncId 为 0,是 C/C++ 环境上的上下文;1,是主程序的环境(及全局);之后递增的,便是走 event loop 的异步环境。triggerAsyncId 是触发这次异步操作的 executionAsyncId。
开启或者关闭(在 create 后默认是关闭的)。
当异步操作初始化后或者完成时,将调用回调来通知用户。before 回调在所述回调执行前执行。before 回调可能被执行 0 次或 N 次。当异步操作被取消时,before 不会被调用;类似 TCP 服务器会调用 before 多次;像 fs.open 只会调用一次。
当通知用户的回调执行完成后立即执行。
当与 asyncId 相关的资源销毁时(依赖于 gc)被调用。它也会被内嵌的 API __emitDestroy ()__调用。
当 Promise 的 resolve 调用时被调用。