Fork me on GitHub

nodejs开启子进程方法spawn与exec的不同[翻译]

nodejs的子进程模块(child_process)有两个方法,spawn和exec方法,通过使用它们我们可以在计算机上开启一个子进程来处理其他程序。这里可能让我们困惑的是为什么有两个方法来做同样意见事情,那么到底哪个应该被使用。在这里,我会解释它们的不同,来帮助你决定什么时候使用哪一个方法。

最大的显著区别在于它们的返回。spawn方法返回一个流,exec方法返回一个buffer。

spawn方法返回一个标准输出流和标准错误流对象。你可以通过标准输出流读取子进程返回给node的数据,标准输出流拥有data end和其他流对象所拥有的其他事件。当你希望子进程返回较大数据比如图像处理,二进制数据读取等给node的时候,采用spawn方法非常使用。

spawn方法是一个异步的异步方法,就是说一旦子进程开始处理,它就开始在流中从子进程返回数据。

你可以看这个例子,其中使用curl向node发起的请求,然后用spawn去读取它的处理结果。

exec方法返回子进程返回的整个buffer对象。默认情况下buffer的大小限制是200k.如果一个子进程返回数据量超过这个限制,你的程序将会报‘Error: maxBuffer exceeded’这样的错误。你可以通过设置更大的buffer大小来修正这个问题。但是并不建议你这么做,因为exec并不是一个可以向node返回大缓存的进程。这个时候你应该使用spaws去处理。那么什么时候使用exec呢?当返回一些状态而不是数据的时候在程序中使用它。

exec方法是一个异步的同步方法,就是说尽管exec方法是异步的,但是它需要等待子进程结束,并且试图一次性返回所有的buffer数据。如果buffer数据的大小限制不够大,很可能就会报‘大缓存溢出’的错误。

看这个例子,我使用wget命令去下载文件,然后用exec方法来处理wget命令返回的下载状态。

这就是spawn和exec方法的不同。当你启动的子进程返回较大的二进制数据给node的时候使用spawn方法,当你的子进程返回一些简单的状态信息的时候使用exec方法。

附上原文

The Node.js Child Processes module (child_process) has two functions spawn and exec, using which we can start a child process to execute other programs on the system. Those new to child_process may wonder why there are two functions to do the same thing, and which one they should use. I’ll explain the differences between spawn and exec to help you decide when to use what.
The most significant difference between child_process.spawn and child_process.exec is in what they return - spawn returns a stream and exec returns a buffer.
child_process.spawn returns an object with stdout and stderr streams. You can tap on the stdout stream to read data that the child process sends back to Node. stdout being a stream has the “data”, “end”, and other events that streams have. spawn is best used to when you want the child process to return a large amount of data to Node - image processing, reading binary data etc.
child_process.spawn is “asynchronously asynchronous”, meaning it starts sending back data from the child process in a stream as soon as the child process starts executing.
You can see an example here where I used spawn to read the results of a curl request to Node.
child_process.exec returns the whole buffer output from the child process. By default the buffer size is set at 200k. If the child process returns anything more than that, you program will crash with the error message “Error: maxBuffer exceeded”. You can fix that problem by setting a bigger buffer size in the exec options. But you should not do it because exec is not meant for processes that return HUGE buffers to Node. You should use spawn for that. So what do you use exec for? Use it to run programs that return result statuses, instead of data.
child_process.exec is “synchronously asynchronous”, meaning although the exec is asynchronous, it waits for the child process to end and tries to return all the buffered data at once. If the buffer size of exec is not set big enough, it fails with a “maxBuffer exceeded” error.
See an example here where I used exec to execute wget to download files and update Node with the status the execution.
So there it is - the differences between span and exec of Node’s child_process. Use spawn when you want the child process to return huge binary data to Node, use exec when you want the child process to return simple status messages.

原文地址

babel6与以前版本的区别和使用

babel6分离

babel5及之前是一个包含CLI工具+编译器+转换器的集合工具包。

babel6之后分离成为两个包。

npm i babel-cli -g // CLI工具
npm i babel-core --save // 在node项目中使用

babel6默认情况下不携带任何转换器,需要自行安装所需的插件和转换器

plugins是比较细粒度的插件配置项,如下示例:

// 箭头函数插件: 
    npm i babel-plugin-transfrom-es2015-arrow-functions
    plugins: ['transform-es2015-arrow-functions']
// let变量插件:
    npm i babel-plugin-transform-es2015-constants
    npm i bable-plugin-transform-es0215-block-scoping
    plugins: ['transform-es2015-constants', 'transform-es2015-block-scoping']
// babel-runtime:
    npm i bable-plugin-transform-runtime
    plugins: ['transform-runtime']
...

presets是预设,相对plugins是更加方便的套餐配置,如下示例:

// es2015:
    npm i babel-preset-es2015
    presets: ['es2015']
// react:
    npm i babel-preset-react
    presets: ['react']
...

.babelrc的配置示例

{
    // 更加细粒度的插件
    plugins: ['transform-runtime'],
    // 预设
    presets: ['es2015']
}
阅读全文 »

随笔而已

今年过了元宵才回来上班,工作以来从来没有休过这么长的假期。

回来以后状态还不是很好,一度总在思考人活着到底为了什么的问题。

自己还是太感性,太随心所欲,不能克制自己的想法,不能很理性的决定一些事情。

每天晚上3 4点钟总要醒来,想我闺女,晚上总会梦见回家看孩子。

中午一个人去吃饭,莫名的开心和自在,那种孤独的快乐。

下班回来的路上,看着路边的高楼,万家灯火,我想我一定要在北京有一套自己的房子。

最近看完了陈坤的《突然就走到了西藏》,很佩服他的努力,他的才华,更佩服他直面自己内心的勇气。

以前我总觉得一个人要变得强大要不断去经历,去体验,去感悟。

突然觉得人的强大来自于内,而不在经历了多少挫折,苦难,荣耀,辉煌。

以前我在面对精神挫折时,经常使用眼观鼻,鼻观心的方法让自己镇静下来。

我要尝试打坐去体验内心的宁静。

我也要修炼出一颗强大的内心。

基于nodejs进行前后端分离

为什么采用前后端分离

1.传统的以后端为主的mvc架构对同步的业务场景处理起来得心应手,但是在夹杂有异步的情况下,需要前后端人员进行沟通处理,有一定的沟通成本存在
2.spa页面在前端层次实现了mv*分离,但是这类业务场景适合的是全异步(首屏可同步)场景,并且在web业务,这类场景并不多,seo效果也不理想
3.从这个层面讲前端对web中的controller和view层进行处理更为合适,前端可以自行决定一个请求采用同步方式还是异步方式,数据输出类型也由前端自行决定。
4.后端同学再也不必关心view层结构渲染等等问题,只关心业务逻辑 业务数据 数据结构等方面,对外提供接口即可
5.前端同学在接手原来的controller和view层后,工作量虽然有一定程度的增加,但会带来几个好处:

  • 前后端模版引擎可以保持一致,维护同一套模板将减少工作量和维护成本,并且使得同步/异步渲染效果一致
  • 前端此时可以做一些以前必须前后端配合才能进行的工作,比如http方面性能优化(比如页面有5个数据量不大的异步请求,再前端控制这部分后可以进行优化一次去请求,性能将提升好几倍),另外在前后端联调上,以前后端的接口针对表现层,写测试用例比较困难,但是针对model层则简化很多,相对前端同理,并且这俩部分测试是可以有希望简化到用程序进行测试

未完待续

函数式编程

函数式编程与指令式编程

函数式编程的特点

javascript函数式编程

参考资料

函数式编程
函数式编程初探-阮一峰
函数式编程与指令式编程
functional-javascipt

linux命令

本文持续更新…

nohup

nohup commads &

注意结尾的&

mkdir

在当前目录下创建一个不存在的目录,前提是当前用户对当前目录具有写权限。

-m 设置新建目录的存取权限,也可以通过chmod命令设置

-p 一个路径名称,可以一次创建多层次的目录

rmdir

删除一个目录,前提是这个目录必须是空的

阅读全文 »

mac终端命令

目录与路径

cd ls pwd

cd

意为change dirtories,切换目录,可以使用绝对路径,也可以使用相对路径(绝对路径从磁盘根目录/开始,相对路径相对于当前目录),如果不指定任何目录名,则切换到根目录。

目录中含有特殊字符,处理方法1转义2使用引号。eg cd project\ box 切换到文件夹’project box’,或者使用cd ‘project box’

pwd

意为print working dirtoriy,打印出当前所在的目录的绝对路径

ls

意为list dirtoriy contents,列出文件的内容,其他参数可以参考linux命令中该命令的参数解释,常用ls -a 列出所有(包含隐藏文件),ls -l 列表形式列出,ls -h 将文件大小人性化方式打印出,ls -A同-a但省略掉当前目录.和上级目录..

阅读全文 »

git常用命令

命令

配置命令

git config命令用来读取和配置工作环境变量。
    git config --system ...
    位置:/etc/gitconfig
    系统级别的环境变量配置,对所有用户的所有项目都适用

    git config --global user.email "zuiwosuifeng@gmail.com"
    位置:~/.gitconfig
    用户级别的环境变量配置,对该用户的所有项目适用

    git config user.email "luwenlong@baidu.com"
    位置:${root}/.git/config
    项目目录下的环境变量配置,对当前项目适用。

配置项
    git config user.name "风清扬" #用户名
    git config user.email "zuiwosuifeng@gmail.com" #邮箱
    git config --global core.editor emacs #编辑器
    git config --global merge.tool vimdiff #差异分析工具
    ...
阅读全文 »

chrome插件开发入门

chrome插件开发介绍

以前我一直非常喜欢firefox,觉得chrome只是个后起之秀,它具备的功能firefox都有,插件还没chrome丰富,经常firefox和chrome都打开用来调试,当我会进行chrome插件开发后基本上只用chrome浏览器了,因为哪天你想实现需要的chrome插件,自己动手搞一个就是了,开发它只需要必备css,javascript知识就够了,对前端人员实在太酷了。别的不多说了,下面介绍一下我的理解和开发经验。

chrome插件结构示例说明

cmshelper
    manifest.json
    pop.html
    pop.js
    background.js
    icon.png
一个插件必备的骨架结构就是这样,内容丰富的插件文件会比这个多很多
但是都是在配置中定义的,明白各配置项的作用就行了。
阅读全文 »