Quantcast
Channel: CNode:Node.js专业中文社区
Viewing all 14821 articles
Browse latest View live

【杭州】全民直播--招聘Node开发工程师 10K-28K,初级/资深,我们都欢迎

$
0
0

Node开发工程师 职位描述 1、负责项目的开发和优化。 2、负责对产品提出意见,提出有趣的想法并有高效的执行力实践你的想法,伙伴们会全程协助你。

职位要求 1、熟悉 Koa、Express 等常用的 Node.js 框架; 2、了解 HTTP 协议以及浏览器原理; 3、熟悉Redis 等缓存; 4、熟悉mysql, mongodbd等数据库 5、熟悉RESTFUL,了解TCP/IP、RPC、SOCKET、WEB SOCKET等通讯协议。 6、JavaScript基础扎实,熟悉ES6特性 7、熟悉promise,generator异步流程控制

加分项: 有 Node.js 高并发,性能优化等经验加分。 有 elasticsearch, kafaka 等经验加分。 有 直播行业工作经验 加分。

工作地点:杭州城西海创园附近。 简历请投:zhengcongcong@qmtv.com


请问,有哪个包可以方便的“存取”一个大的json对象到一个文件里?

$
0
0

我们的业务需求,需要创建N多个小文件,每个文件里存一个json对象。 一般的做法是:拿到json对象,stringify,然后以字符串形式存到一个特定的文件里。需要的时候再从特定的文件里读出来,parse一下,然后再用。

请问,有没有某个包,更优雅的实现这个操作啊? 多谢。

Centos 从安装到部署之 Docker(二)

$
0
0

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

本篇文章作为 《 Centos 从安装到部署》 的第二篇文章,将会为大家简单介绍一下 Docker 的基本命令及使用,为下一篇 应用的自动化构建及部署做一个知识铺垫。如果阅读过程中发现有疑问可以在文章末尾留言讨论 : ),主要内容如下:

  1. 如何在 Centos 上 安装 Docker 及 docker-compose
  2. 如何构建应用镜像
  3. 如何运行应用容器

一、如何安装 Docker

Docker支持以下的 CentOS 版本:

  • CentOS 7 (64-bit)
  • CentOS 6.5 (64-bit) 或更高的版本 Docker 软件包和依赖包已经包含在默认的 CentOS-Extras 软件源里,安装命令如下:
yum -y install docker

安装完成后,启动 Docker 后台服务:

service docker start

恭喜你,Docker 已经成功安装并运行了。接下来我们要拉取一个镜像,然后运行一个容器,你没猜错,我们就是要测试运行 hello-word

docker run hello-world

Docker首先从本地主机上查找镜像是否存在,由于我们的本地没有 hello-world 这个镜像,所以 Docker 就会从镜像仓库 Docker Hub 下载一个 hello-world 的镜像,并在容器内运行。 下面介绍几个 Docker 常用的命令: 1、查看本机 Docker 镜像,可以看到镜像名称、标签、id等信息 docker images 2、从 Docker Hub 中查询镜像 docker search <image_name> 3、拉取 Docker 镜像到本地 docker pull <image_name:tag> 4、删除本地指定镜像 docker rm image <image_name / image_id> 5、构建本地镜像,需要切换到要构建镜像的目录下,并确保目录下存在 Dockerfile 文件 docker build -t <image_name>:<tag> . 6、根据镜像 启动容器 docker run <image_name> 带参数启动 docker run -d -i -t -p 3000:3002 --name <container_name> --link=<linked_container_name>:<alias_name> <image_name> 参数说明: -d 让容器在后台运行 -p 将容器内部的网络端口映射到我们使用的宿主机上 3000 为宿主机端口 3002 为容器端口 -i 允许我们对容器进行交互性输入 -t 在容器内指定一个伪终端或终端 –name 指定容器的名称 –link 连接到其他容器 7、查看运行中的容器 docker ps //查看所有容器,包括已经停止的容器 docker ps -a 8、进入运行中的容器 docker exec -it <container_name> bash 9、查看指定容器日志 docker logs <container_name / container_id> 10、停止容器 docker stop <container_name> 11、删除容器,注意,删除容器前一定要先停止容器,否则会报错 docker rm <container_name> 基本上掌握了这些命令,我们就可以愉快的玩耍了,可以从容的拉取镜像,启动容器,并查看日志,也可以停止容器并删除容器。 从步骤 6 相信大家也看到了,如果要带参数运行容器,我们不仅要记住很多参数,而且每次启动容器都需要再输入一遍,不仅繁琐,而且容易出错,“偷懒”是程序员的天性 。有没有一直方式,让我们可以把这些参数都写在一个文件里,再次启动容器的时候去读取这个文件的配置信息呢? 肯定是有的。这时我们就要请出 docker-compose 了。

二、安装 docker-compose

docker-compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。docker-compose 的定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。 在 Centos 上安装 docker-compose 也是非常简单: 1、运行以下命令下载最新的 docker-compose 安装包: sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-compose 当然过几天,这个就不是最新的版本了,可以通过查看 docker-compose 在 github 上的 release 来获取最新版本号。 2、增加 docker-compose 可执行权限 sudo chmod +x /usr/local/bin/docker-compose 3、测试 docker-compose 是否正确安装 $ docker-compose --version docker-compose version 1.18.0, build 1719ceb 至此,docker-compose 的安装也已经顺利完成了!

三、如何使用 docker-compose 来运行容器

在第一部分中,我们已经学习了如何直接使用 docker 命令来运行一个容器,这一节,我们将会了解到如何通过 docker-compose 来编排容器。 docker-compose 可以同时对多个容器进行编排运行。为什么会有多个容器同时运行的需求呢?例如要部署一个 web 应用,除了我们的 web 服务容器本身以外,还需要后端数据库容器(mongo),甚至需要负载均衡配置的容器(nginx)等。docker-compose 恰好就可以完美解决这样的需求,它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。 下面我们将以一个 node 项目为例,后端数据库使用 mongo 来编写一个 docker-compose.yml 文件,来感受一下使用 docker-compose 启动多个关联的容器是多么的方便:

version: '3’
services: recatch-service:
image: yvanwang/recatch-service:latest
ports: - "8082:8082" mongodb: image: mongo:3.4 ports: - "27017:27017" command: mongod -f /etc/mongod.conf volumes: - “./mongod.conf:/etc/mongod.conf” - "/var/lib/mongo:/data/db" 有了这么一个 docker-compose.yml 文件,接下来你只需要在该文件所在的目录运行一行命令: docker-compose up -d 即可同时启动两个容器了,是不是很方便,而且也免去了每次启动容器都需要输入一堆参数的麻烦。以下将对 compose 模板文件的配置进行简单的介绍: version:compose 文件的版本号,compose 文件版本号与docker-compose的版本映射关系 services:定义将要运行的容器集合 recatch-service:容器名称 image:指定为镜像名称或镜像 ID。如果镜像在本地不存在,compose 将会尝试拉去这个镜像 ports:暴露端口,使用宿主端口:容器端口 (HOST:CONTAINER) 格式,如果仅仅指定容器的端口(宿主将会随机选择端口) command:容器启动时执行的命令 volumes:数据卷所挂载路径设置。格式为(HOST:CONTAINER),该项的配置是为了将 容器的数据 挂载到主机上,可以将容器产生的数据和容器分离开,这样当你将容器删除之后,容器的数据依然存在。例如在 mongodb 的配置中,

  • "/var/lib/mongo:/data/db" 就是将容器内数据的存储路径挂载到主机的 /var/lib/mongo 下,这样当容器删除后,mongo 的数据文件依然存在于主机的 /var/lib/mongo 文件夹下。 恭喜你,看到这里,你基本就已经掌握了 docker 的基本操作,已经拥有了构建 docker 镜像及部署容器的基础知识。下一篇我们将一起来探索如何借助 docker 及 daocloud 来实现应用的自动构建及部署,cheers !

该篇文章首发在我的个人博客:https://www.yvanwang.com/post/5a605b691fc3f200212abce0

pm2定时任务未能重启

$
0
0

描述: pm2来定时执行一个邮件发送程序,如果程序是通过process.exit来退出的,就无法重新启动。而如果是正常退出的则能定时启动 ecosystem.json配置如下:

{
  "apps": [{
      "name": "index",
      "script": "index.js",
      "error_file": "err.log",
      "out_file": "out.log",
      "merge_logs": true,
      "log_date_format": "YYYY-MM-DD HH:mm Z",
      "min_uptime": 100,
      "cron_restart": "* * * * *",
      "autorestart": false
    }
  ]
}

好多腾讯视频爱奇艺视频解析的接口,这样的接口是怎么写出来的?有人能分享下吗?

$
0
0

好多腾讯视频爱奇艺视频解析的接口,这样的接口是怎么写出来的?有人能分享下吗? 像下面这种 untitled1.png

【新手提问】关于node经常挂掉,数据库怎么办

$
0
0

node Server 开启,server 可能因为各种各样的问题异常退出,虽然我能够通过线程监控手段让Server在短时间内起死回生,但Server死之前的那些用户请求附带繁杂的数据库请求以及文件请求怎么处理?

[北京] 美团点评 - 招聘前端工程师、Android开发、iOS开发,坑多速来!

$
0
0

我们的业务正在迅猛发展,希望您的加入能让我们有更大的改观和发展。现热招职位如下:Web前端开发工程师 | Android开发工程师 | IOS开发工程师 坐标:北京 简历投递地址:tangyulu@meituan.com

Web前端开发工程师 工作职责 负责toB产品的界面交互开发,为产品提供最好的界面交互体验; 负责建设产品相关的前端系统架构; 随着团队增长,还需要指导初级工程师; 基本要求 具有前端相关开发经验,能独立完成前端开发工作; 热衷学习与自我修炼,喜欢阅读英文原版技术文档和书籍; 精通HTML(5) /CSS(3) /Javascript等前端技术,能轻松写出符合W3C标准、兼容主流浏览器的代码; 精通至少一种JS框架(React\Vue\Angular)或者对JS语言掌握较深; 掌握至少一门非前端开发语言(如PHP/Java/Python/Ruby/Node.js等),并有一定的实战经验; 本科以上学历,计算机、数学等相关专业毕业(或者计算机基础非常扎实); 以下特征优先考虑 具有英文文档阅读能力 具有前端工程、模块化、组件化的经验 具有性能优化的经验 支持开源精神,活跃于 GitHub 有开源作品或技术博客 苹果重度用户、Linux爱好者、技术社区活跃分子 有成功指导初级工程师的经验

Android开发工程师 工作描述: 负责B2B业务Android客户端的开发工作; 参与优化客户端的模块结构、代码质量、性能等; 关注及调研Android/大前端方向的前沿技术。 任职要求: 3年及以上Android开发经验,对Android相关知识有自己的理解; 具有熟练的编程能力,且具有良好的编码风格和习惯; 对Java、基本数据结构、计算机网络有较深入的了解; 有良好的产品意识; 工作责任心强,能够主动发现并解决问题; 有较好的钻研精神、创新精神、团队合作精神、沟通能力及执行能力。 以下特征优先考虑 有自己的博客、github者优先; 有电商类APP开发经验者优先。

IOS开发工程师 工作职责 负责B2B业务iOS客户端的开发工作; 参与优化客户端的模块结构、代码质量、性能等; 关注及调研iOS/大前端方向的前沿技术; 基本要求 2年及以上iOS开发经验; 熟悉Objective-C和iOS SDK及相关开发工具; 熟悉计算机网络,知道从TCP层到HTTP层的工作原理; 习惯查阅英文资料,如Apple官方文档,StackOverflow等; 有较好的钻研精神、创新精神、团队合作精神、沟通能力及执行能力; 有良好的产品意识; 以下特征优先考虑 熟悉响应式编程及相关框架; 有长期积累的博客; 有电商类APP开发经验; 熟悉Swift;

敢想,敢做,完全没有回调,一个完全不同于node.js的javascript写服务端方案

$
0
0

a js server

一种新的javascript写服务端程序的方案,没有回调,完全不同于node.js,完全不依赖node.js

优点:

  1. 免安装,无需配置任何环境,自带sqlite数据库和一个简易的缓存系统
  2. go语言开发,无限扩展功能,可以自由定制(比如并发的支持,可以由go语言实现再由js处理)
  3. 跨平台,支持linux、windows、mac,支持x86/arm/mips等指令集的cpu(你可以在手机、树莓派、路由器…你能想到的任何linux系统中运行)
  4. 完全不同于node.js,没有回调,程序更易维护和编写

缺点(还有更多):

  1. 性能不高,和node.js完全不是一个级别的
  2. api目前不够完善
  3. 目前没有文档支持
  4. 没有debug功能,调试不方便

写node一年了,感觉node的异步很少用到,坑爹的回调让人非常痛苦,在不了解node之前,在我的想象中node就是像php那样写的,但实际上不是这样的,我曾经去找过类似这种东西,但没找到,可能是我的方法不对,所以我决定自己做一个,尝试过用c语言来写,但是那个门槛太高了最终放弃,后来接触了go语言,发现了goja这个开源项目,于是做这个东西变为可能。

如果你觉得这东西没卵用,请闭嘴,且不说有多少实际价值,你肯定想过这种东西,但你没有去做,我把我的想法变成了现实,曾经js写服务器只能选node(也许有其它),现在,有了新的选择。

下载试用 (download)

https://github.com/zengming00/go-server-js/releases自带一个由nodejs迁移过来的商城网站源码,下载解压运行然后打开浏览器 http://localhost:8080/就可以看到效果了


我的2017年总结

$
0
0

我的2017年总结

在知乎上,我回复了《coding到没脾气的时候,你一般都会干什么?》https://www.zhihu.com/question/264015952/answer/278283535这个问题。答案如下

“【不扯淡】年轻时死磕,年长点让小弟死磕,现在抓个专家一起吃饭,没有什么是一顿饭解决不了的,不行就二顿

工程师的能力不是编码和死磕,而是解决问题

很多人点赞,就说的再明白点

  • 年轻死磕是为了长本事,30岁以前都可以这样做
  • 带团队后,要懂得任务下放,让更多人帮你,别带人越多越累
  • 30岁之后是打牌阶段,技能积累足够用,这时要注重社交,打组合拳才能玩的更好

少抱怨,多思考,未来更美好

强调30岁不是我创造的,大部分人都会认为30岁后事情,压力会明显大得多,比如家庭,孩子,房子,车子,票子,甚至是管理,权利,欲望等等吧。我感受最深的是身体不如从前和记忆力明显下降。”

这其实是我这1年一个非常大的变化。想明白了很多事,心态上好了很多。另外,作为网红的好处的是你能够接触到更多信息和更好的朋友圈子。这其实是以前没法做到的。我本身也是偏于内向的人,只是不得已做公众号,演讲,布道,应酬,收获当然也是相当丰富的。以前看事情是,现在看的是趋势,能够做到心中有数,自然胸有成竹的感觉。

淡然,自省,大概是个比较好的状态。

2017年年初儿子出生,银川没有合适工作,不得已,去了去哪儿工作,这也是个艰难的选择。之后去了得到,现在在阿里巴巴,关于工作的个中曲折后面会讲。在qunar的时候比较闲,跟着莫子(付洪波)老师练了半年多的形意拳,后来被方圆和timyang等老司机影响,也开始学习摄影。其实书法,诗歌,摄影类的艺术来说是有共性的,希望自己能够坚持下去。

在个人品牌方面,这1年时间做了很多场500+人得演讲,写了很多精华文章,单篇最高超过9万阅读量。Node全栈公众号超过1.8万粉丝,我的个人知乎半年时间粉丝超过2200人(之前没玩过,感谢justjavac大神带路),组织了几次活动,也算是不错的尝试,可以接触到更多的Node.js相关的高手和各种需求,解决方案,对我的知识面是有很大提升的。另外,从qunar到阿里巴巴大厂摸爬滚打,也是学到很多东西,大厂是有很多有内涵的东西的,当然这要靠自己挖掘。同时,建立了个人网站 i5ting.com,目前东西还比较少,但至少起步了。

在2017年,完成了2本书:《更了不起的Node.js》和个人诗集《春天的恐惧症》。更了不起的Node.js拖了2年了,从Node 4写到node9了,过程是痛苦极了的,其实这2年对我的成长也是极大的,大部分时间都是在构建我个人的知识体系。本书“了不起”就是个很难讲的,要讲清楚“更了不起”就是件更难的事儿!好在node在最近2年应用场景等方面有了更广更好的应用,自身知识体系加上qunar和阿里巴巴的经验,能完成也是不容易的,换工作也是有好处的。目前2本书都交给编辑了,应该很快可以面世了。

儿子已经一岁了,我媳妇把孩子照顾的非常好,健康,活泼可爱。这一年,我往返北京和银川太多次了。以前在quanr的时候,我没有租房,几乎每周末都回家。宝宝还没出生,我就到北京上班了,在qunar工作的那段时间里,我是最嚣张的,请了好多假。每周五晚上回银川,周日晚上回北京,卧铺车厢无情的空调,吹得我中风几次。可是,还是要回家。老婆孩子都在地方,才是家。最难过的是周一到周五,只能看媳妇通过微信发来宝宝的视频,一遍一遍的看,一遍一遍的想哭。

媳妇发来宝宝的视频

媳妇发来宝宝的视频
只有九秒,一遍一遍的看
宝宝二个月了
已经会吃衣袖了

媳妇发来宝宝的的视频
只有九秒,既短又长
已经有六天没有见到了
愈加想念

他不会说话,只会哭喊
他不会动,虽然很想动
他不乖,除了吃奶的时候
他还不能陪爸爸一起玩

媳妇发来宝宝的视频
只有九秒,一遍一遍的看
一路上,一遍一遍的看
一遍一遍的想笑,想哭。。。

“路人一定都觉得爸爸是个可爱的神经病”

关于工作

  • Qunar机票
  • 得到,呆了7周
  • 阿里巴巴大文娱

很多人在网上黑我,说我换工作比较多。当然这是事实,但也要不至于如何如何吧。

Qunar的管理和公司流程做的非常好,其内部被携程合并之后能做的事儿并不多。其实在qunar做的事儿是比较少得,大部分时间都在往返北京和银川的路上。在qunar,我做了3件事儿

从qunar离职后,我去了得到,罗胖的公司。知识付费领域做的相当好的品牌。最有希望的独角兽,我以为自己能够在里面做出点成绩,我对罗辑思维的评价

  • 品控做的确实好,所有产品公司里确实牛逼,打磨一个课程能够如此用心,真是难得。编辑工作做的也极好,对于错字,典故等也审核极其严格。
  • 产品细节做的也不错,快刀青衣对产品的把握感觉非常好,如果没想清楚,宁可不加,这在某种程度上,保证里app的简洁。

但是一个快速增长的公司必然面临扩张期的阵痛,老的项目一堆,新招一堆高手也不会立马奏效。面临的都是两难选择,之前的东西不想碰,自己擅长的又用不上,真是很尴尬。之前我以首席架构师进去的,但没法在架构上做改进,很多东西不是一个人能搞定的。另外业务发展太快就导致管理跟不上,天天各种需求追的要命,还要兼顾团队建设,这事情哪能鱼和熊掌兼得呢。

我对自己的定位是专注于Node.js技术,既然没法做更多Node.js相关的内容,不如就离开。

我个人挺喜欢快刀的做事风格,也可怜他的处境。我也创过业,也激情过。我特别理解他的想法。他选了个好方向,罗胖和脱不花也确实是在各自领域做的不错,祝福吧。

之后,我去了阿里巴巴大文娱,就是之前的老优酷,技术名声以前是不太好的。但好在被阿里收购1年多得时间,基本都改成阿里基因了。我进入的时间还好,老板也很信任,交给我很多我很有干劲的工作。比如h5播放器,之前很多人都没搞定,把一个极其传统的代码改成一个时髦的开发方式,使用babel,webpack,做了单元测试和端到端测试,采用模块化和面向对象,架构做的我觉得还不错。我能感觉到团队的变化,我很高兴的。当然,我对大家也是比较狠的,每天review代码到很晚,每个细节都会抠,每天回家都非常玩,大家其实状态还不错,解决了以前的困扰,在技术能力上也有提升,最重要的是有成就感,原来这样写代码,大家都可以的。这种带团队的过程对我来说也是非常有成就感的。当播放器成熟,内部稳定后,通过公司审批后,也会走开源之路,也希望给公司的技术影响力做一些贡献。

我是降薪来的阿里,原因有三,一是有事可为,老板重用你给你机会,二是集团内部是open的,偏偏我知识面足够可以看出它们的好处,算是另一种补偿吧,三是对个人品牌是一个升级,狼叔的职业生涯到此已经足够了,进可攻退可守,也算另一种自由吧!

钱多是个优势而已,还有氛围,文化,信仰

  • 牛人多
  • 业务需要
  • 成熟后有更多精力
  • 内部竞争,优胜劣汰
  • 财务相对自由,可以追求信仰了

前几天还和 @苏千 聊,我和 @死月絲卡蕾特 相继入职阿里,还有cnode社区著名程序员也即将入职阿里,当时大家开玩笑说:

“前端的终极归宿是阿里,不是在阿里,就是在去阿里的路上”

另外要说的一点是pc和h5站在使用Node.js做api中间层,其最佳实践已成型,量也是极大的。以前前端玩得还是比较弱,如果能够缓存+控制页面数据,获得一个性能极大的提升也是极好的。2018年,争取拿这个做主题演讲上qcon或archsummit大会。

每天忙得很开心,这就是我现在状态。其实,我的折腾还是在于想做些事情。如果你也想跟我一起做事,请将简历邮件给我 langshu.ssl@alibaba-inc.com,团队大量招人,也可以帮忙推荐给集团其他部门。

关于《更了不起的Node.js》一书

节选部分和目录,让大家先睹为快。

Node.js 简介

Node.js 诞生于 2009 年,由 Joyent 的员工 Ryan Dahl开发而成,之后 Joyent 公司一直扮演着 Node.js 孵化者的角色。由于诸多原因,Ryan 在2012年离开社区,随后在2015年由于 Node 贡献者对 es6 新特性集成问题的分歧,导致分裂出iojs,并由 iojs 发布1.0、2.0和3.0版本。由于 iojs 的分裂最终促成了2015年Node基金会的成立,并顺利发布了4.0版本。Node.js基金会的创始成员包括 Google、Joyent、IBM、Paypal、微软、Fidelity 和 Linux基金会,创始成员将共同掌管过去由 Joyent 一家企业掌控的 Node.js 开源项目。此后,Node.js基金会发展非常好,稳定的发布5、6、7、8等版本,截止发稿最新版本已经是8.6,长期支持版本是6.11。

Node.js 不是一门语言也不是框架,它只是基于 Google V8 引擎的 JavaScript 运行时环境,同时结合 Libuv 扩展了 JavaScript 功能,使之支持 io、fs 等只有语言才有的特性,使得 JavaScript 能够同时具有 DOM 操作(浏览器)和 I/O、文件读写、操作数据库(服务器端)等能力,是目前最简单的全栈式语言。

早在2007年,Jeff Atwood 就提出了著名的 Atwood定律

任何能够用 JavaScript 实现的应用系统,最终都必将用 JavaScript 实现

目前 Node.js 在大部分领域都占有一席之地,尤其是 I/O 密集型的,比如 Web 开发,微服务,前端构建等。不少大型网站都是使用 Node.js 作为后台开发语言的,用的最多的就是使用Node.js做前端渲染和架构优化,比如 淘宝双十一、去哪儿网的 PC 端核心业务等。另外,有不少知名的前端库也是使用 Node.js 开发的,比如,Webpack是一个强大的打包器,React/Vue是成熟的前端组件化框架。

Node.js通常被用来开发低延迟的网络应用,也就是那些需要在服务器端环境和前端实时收集和交换数据的应用(API、即时聊天、微服务)。阿里巴巴、腾讯、Qunar、百度、PayPal、道琼斯、沃尔玛和 LinkedIn 都采用了 Node.js 框架搭建应用。

另外, Node.js 编写的包管理器 npm 已成为开源包管理了领域最好的生态,直接到2017年10月份,有模块超过47万,每周下载量超过32亿次,每个月有超过700万开发者使用npm。

当然了,Node.js 也有一些缺点。Node.js 经常被人们吐槽的一点就是:回调太多难于控制(俗称回调地狱)和 CPU 密集任务处理的不是很好。但是,目前异步流程技术已经取得了非常不错的进步,从Callback、Promise 到 Async函数,可以轻松的满足所有开发需求。至于 CPU 密集任务处理并非不可解,方案有很多,比如通过系统底层语言 Rust 来扩展 Node.js,但这样会比较麻烦。笔者坚信在合适的场景使用合适的东西,尤其是在微服务架构下,一切都是服务,可以做到语言无关。如果大家想使 JavaScript 做 CPU 密集任务,推荐 Node.js 的兄弟项目 fibjs,基于纤程(fiber,可以简单理解为更轻量级的线程),效率非常高,兼容npm,同时没有异步回调烦恼。

关于本书

本书是我学习和使用 Node.js 的总结。在学习和使用 Node.js 的过程中,我写了不少文章,并对一些文章进行了加工和完善,发表在cnode论坛和Node全栈公众号(nodeonly)上。在2015年初,我在天津创业,位置在空港附近,为了招人不得不做一些科普、布道的工作。当时是被忽悠的,创始人都不拿工资(蠢,被坑死后才知道),结婚后媳妇在银川,我手上没钱,又不好意思找媳妇要,所以和 StuQ 做了一点课程,效果还不错,后来就和 StuQ 结缘,做知乎 Live 等,霍老板钦定 StuQ 明星讲师。随着 Node.js 科普、布道的增加,我就萌生了写一本书的想法,希望能比较系统地总结相关知识,巩固自己的知识体系,而不是停留在『零散』的状态中。正好被博文视点的大编辑张春雨发现,于是就有了这本书。

首先,我参考一些相关的书籍,作了一个基础的思维导图。接下来,就要开始写作了,这也是最艰难的一关。

我没有按照从头到尾的顺序写,而是已有相对比较完善的知识点入手,比如Koa框架、异步流程控制等等。就这样,一点一点地写,实在不想写了,就先搁置一下,过两天继续写。整个过程持续了2年,和编辑开玩笑说:“开始写的时候是Node 4.0,交稿的时候Node已经8.0了”。

我在写作的过程中,给自己提了一个要求:尽量深入浅出,条理清晰。至于是否达到了,希望读者们多多批评指正,并给我提意见和建议。

目录

博文视点的美女编辑在苦逼的整理中,预计出版在3月之后,20章,800页+,定价预计在130+。

主题演讲

精华文章

年度文章《2017,我们来聊聊 Node.js》 https://cnodejs.org/topic/58eee565a92d341e48cfe7fc,此文截止发稿已经单篇超过9万阅读量。在qcon大会,被徐川主编选为推荐文章,答疑解惑,大局观还是相当不错的。另外《Node.js 2016 回顾以及2017展望》h ttps://cnodejs.org/topic/588a959b1dc8ff8739cbc66d 也是类似的精华文章。

网友yanlele评价

毕业开始就开始撸JS,因为以前java出身,始终放不下java,最近两个月才开始真正接触node,一直在想node真的有前景嘛?一直很困扰在下,在下所在的城市,几乎没有用node真正意义上做开发的公司。这篇文章我也是前几天才看到,反反复复看了很多遍,真的写的很好。希望node在未来的18年会越来越好。

狼叔回复的《Node相比传统服务端技术栈好在哪里?》https://cnodejs.org/topic/5a328967d92f2f5b185ace96,回复之后某个喷子的文章,据说贺老hax在阅读此文,因为太投入,导致坐过站了。

狼叔说:本来不想回复的,匿名的那哥们写的挺好的,虽然不懂他为什么要匿名。但看到某些回复,不得不说几句。乱解读,误人子弟的事,还是有必要澄清的,以免Node有无端被黑,相信这也是所有布道者都应该承担这种除魔卫道的责任。

《请别拿“死”人做文章》https://cnodejs.org/topic/59daf46f2543cb3368b1627e,主要是因为Node.js之父Ryan Dahl在google使用go,导致某些人过度解读。故而回复,以正视听

狼叔说:Node.js之父Ryan Dahl在2012年就离开社区的,我们必须要承认他作为创始人的伟大创举,但不能标签化,ryan不代表node,从他离开社区后,对于社区而言,他就“死”在曾经的丰功伟绩上,未来与他无关!

《迷茫时学习Node.js最好的方法》https://cnodejs.org/topic/59c75a3dd7cbefc511964688,这篇文章反响还不错,解决了部分人的迷茫。

狼叔说:这是真事儿,在3w咖啡整理书稿,然后小弟梁过来了,聊聊他的现状,一副很不好的样子,在天津我曾带过他大半年,总不能不管,我给他的建议是:“每天看10个npm模块”

对于学习Node.js迷茫的人来说,这是最好的方式,当你不知道如何做的时候,就要向前(钱)看,你要知道积累哪些技能对以后有好处。对于学习Node.js必经之路,一定是要掌握很多模块用法,并从中汲取技巧、思路、设计思想的。与其不知道学什么,为什么不每天积累几个技巧呢?

《请叫我Node.js 8》兼发布说明,https://cnodejs.org/topic/592e377e855efbac2cf7a4dd,Node.js 8的发布是里程碑事件,随后就发布了Koa 2.x正式版。

为了避免和V8引擎的名字冲突,请叫我Node.js 8

核心内容

  • 是下一个长期支持版本
  • 更新 V8 到 5.8版本: 核心变更TurboFan & Ingnition(加了jit即时编译)
  • 更新 npm 到 5.0.0:宇宙最快+自带lock文件
  • 引入新的 c/c++ 扩展方式:N-API,解决addon的编译问题
  • Async函数性能提升
  • Async Hooks API支持

《如果你来设计一个基于Webpack的前端开发工具》https://cnodejs.org/topic/591919d4ba8670562a40f106,对于webpack和前端工程化演讲,自以为是得意之作。能够真正从如何打包,到浏览器解包过程来分析的,目前看只有我一个人。帮玉浩review了《Webpack前端工程化入门》http://gitbook.cn/gitchat/column/59e065f64f7fbe555e479204。这篇入门也还是相当不错的。

虐狗文《从你的全世界悔过》https://cnodejs.org/topic/59a4102d9e95202d08c91d45,此文是七夕时给媳妇写的诗歌串起来的一篇文章,很多人说读了还挺感动,知乎上也收获不少赞。诗歌就不帖了,来一小段节选。

“喜欢一个人就是喜欢,不需要什么理由,你看到她第一眼的时候,就知道这个女人会注定陪我一生。我们也没什么物质追求,只是简简单单的,在一起,很开心,想结婚,想和她过一辈子。

很多人都知道我的网名是i5ting,这里的ting就是她,张婷的婷!我在很多公众场合都是这样自我介绍的:“大家好,我是i5ting,婷是我媳妇的名字”,然后大家就笑了。”

组织的活动

北京Node Party活动本想在年再举办一次,奈何太忙,放到2018吧。

付费学习

诗歌

个人诗集《春天的恐惧症》已付梓,由上海文艺出版社出版,168页,由著名诗人破破作序《物质时代的草甸之子》,在知乎上回复了《程序员可以培养的第二技能有哪些?》https://www.zhihu.com/question/264575890/answer/291053439

【很多人说写作,我想说你们那是码字。能高雅点么?】

今年诗歌写的少,只有20多首。

  • 我的2017年总结
  • 在22楼
  • 儿子
  • 星空漫想
  • 好先生第三十五集观后感
  • 《补身份证记》
  • 我来的时候风景正好
  • 谁说相见不如倾慕
  • 节日
  • 行走在阳光下
  • 书签
  • 相聚与相遇
  • 媳妇发来宝宝的视频
  • 从你的全世界悔过
  • 春天的中午
  • 大米
  • 静静地看着他
  • 梦魇
  • 无题
  • 烟囱与婴儿
  • 初冬,一个干活的人

《补身份证记》的后2章节可为很精彩,很多人都非常喜欢。我是很不满的情绪,大概可见一斑。

这事儿也是有好处的
今天去厕所,无纸
一摸兜,一打还没来得及扔的临时证明
不就是一打纸吗?
虽然有点硬
虽然只有巴掌大小
我把大头照片一一取下
向辉煌抹去


那一刹那
我竟还忍不住感动
临时身份证上,姓名和身份证号码
深深地印在屁股上

其实,我个人最喜欢的诗歌是《星空漫想》。缺少的在补,想要的在继续。不知道能有多少人能够理解30岁之后的感谢。其实有很多人跟我一样。

《星空漫想》

像量天尺一样,鼓起勇气
向夜晚迈出大大的一步
我知道,离星空还远
我只是想给未来一个大大的拥抱

像烟花一样,一飞冲天
燃烧,绚烂,哪怕变成一缕青烟
我知道,生命和星星一样,可望而不可及
只能努力的,不错过每一颗

不知道自己拥有什么
也不知道自己想要什么
仿佛一切,只是向死而生
我们站在星空下,无限渺小

其实你还是你,夜还是夜,星空还是星空
缺少的在补,想要的在继续
在无限的找寻中,一直都是自己与快乐斗争
散落星空的战友,像极了无数个自己

总结

最后用《我的2017年总结》来结尾吧,元旦当晚,我和妻儿一起看电视,吃橘子,感慨一年过往。诗歌写的像故事一样,对比情景,还是比较温暖的。

这一年特别快
孩子已经快一岁了
我也出去了一年
许多心酸许多感谢

她觉得慢
她只做了一件事儿
照顾孩子,辛苦更多
感恩更多

媳妇给孩儿扒橘子
将橘子皮扒开
将橘子肉分几次
送到孩子嘴里

我给媳妇扒橘子
直接送她嘴里
宝宝拍拍我的肩
一定是嫌我送的快了

预告

极客时间App上,即将发表《Node.js全栈2018前瞻》专题

写这篇文章的原因是在2017年,我写了一篇《2017,我们来聊聊 Node.js》,单篇阅读量将近9万,效果还是相当不错的。但很多科普工作做的还不够好,比如在2017年底,被某些喷子在知乎上黑Node.js,当时我虽然回了一篇狼叔回复的《Node相比传统服务端技术栈好在哪里?》,但还是深感焦虑,很多人对Node.js理解的是不太正确的。

比如常见问题

  • Node.js是js语法,能不能像java一样大规模开发?
  • Node.js适不适合写后端?
  • Node.js异步写法太麻烦,回调太恶心。。。
  • Node.js性能到底和go相比如何,我要不要转go?
  • 前端技术发展那么快,我该怎么应变?

故而,我打算在本篇文章里把2018年以Node.js为中心的主流趋势科普一下。希望为Node.js正名尽微薄之力。

大纲

  1. Node.js2017回顾和2018概览
  2. 不要异步,我们要同步流程控制:Async函数和更好的ES6模块模块
  3. 类型系统和面向对象的完美es6超集:TypeScript && flow && coffee
  4. 大前端、工程化与AI时代应变:Webpack && Weex & Electron
  5. 日渐成熟的Node.js企业级Web开发框架:Strongloop、Eggjs、Thinkjs
  6. Node.js生态、架构演进和商业案例再思考

【知乎Live】狼叔:如何正确的学习Node.js

Live 简介 你好,我是 i5ting ,江湖人称「狼叔」,目前是阿里巴巴技术专家,斯达克学院( StuQ )明星讲师, Node.js 技术布道者。曾就职于去哪儿、新浪、网秦,做过前端、后端、数据分析,是一名全栈技术的实践者。

现在,越来越多的科技公司和开发者开始使用 Node.js 开发各种应用。Node.js除了能够辅助大前端开发外,还可以编写Web应用,封装Api,组装RPC服务等,甚至是开发VSCode编辑器一样的PC客户端。和其它技术相比, Node.js 简单易学,性能好、部署容易,能够轻松处理高并发场景下的大量服务器请求。Node.js 周边的生态也非常强大,NPM(Node包管理)上有超过60万个模块,日下超过载量3亿次。但编写 Node.js 代码对新人和其它语言背景的开发者来说,不是一件容易的事,在入门之前需要弄懂不少复杂的概念。

我身边也有很多人问我:如何学习 Node.js ?作为一名 Node.js 布道者,我做过很多 Node.js 普及和推广的工作,对它的基本概念和核心模块都很熟悉; 此外,我还在撰写一本名为《更了不起的 Node.js 》的书,已经写了 2 年,积累了很丰富的资料,本次 Live 也将为你提供对 Node.js 更全面的解读。

本次 Live 主要包括以下内容

  1. 前言:学习 Node.js 的三个境界
  2. 准备:
    • Node 用途那么多,我该从哪里学起?
    • Node Web 框架那么多,我该怎么选?
    • 关于 Node 的书几乎都过时了,我该买哪本?
  3. 延伸:大前端变化那么快,如何才能做到每日精进?
  4. 实践:从招聘角度来看, Node.js 开发需要具备哪些技能?
  5. 答疑:回答大家的问题

本次Live主要是科普,适用新用户和比较迷茫的Node朋友,参加地址

https://www.zhihu.com/lives/928687583372926976

时间是明天晚上哦

WEBPACK + JSP 构建多页应用

$
0
0

概述

传统的JSP页面应用无法有效的使用ES6语法特性,项目打包压缩困难,无法热更新。传统的单页应用在Tomcat等容器下无法进行服务端渲染到达SEO的效果。本项目工程很好融合的传统JSP页面服务端渲染的特点和单页应用开发特性且极易上手使用!

源码地址

源码地址

Demos与文档

Demos与文档

特性

  • 多页应用
  • JSP嵌套
  • el表达式
  • 服务端渲染(SEO)
  • 热部署
  • js,css语法转换
  • eslint
  • 热更新
  • 支持Vue
  • 打包压缩
  • IE9+ 支持传统JSP开发所的所有功能;可以通过自定义webpack配置来实现对react的支持;通过引入vue-router和vuex某一个页面完成可以变成一个单页应用。

如果您想要支持IE8,那需要把webpack降级,因为webpack2+是不支持IE8的,以及尽量避免去使用不支持IE8的库,比如jquery2+,lodash4+, Vue等,祝您好运。

环境搭建

工欲善其事,必先利其器。

  • JDK1.7+
  • IntelliJ IDEA,需要安装js相关插件和配置支持es6语法。
  • Maven3+
  • Tomcat7+,端口默认请使用8080
  • Git bash
  • npm3+
  • node7+

如果您喜欢编辑js和css的时候用vscode也是没有问题,不过编写jsp和java还是推荐用idea。

以下总结环境配置的相关文章,可供参考 JDK下载地址IntelliJ IDEA配置前端开发环境IntelliJ IDEA配置JAVA WEB的Tomcat环境maven下载安装Git Bash下载安装

目录说明

├── pom.xml   // maven配置文件
├── src
|  ├── main
|  |  ├── filters
|  |  |  └── resources // java工程资源配置目录
|  |  ├── java // java代码目录
|  |  ├── js // 前端页面工程
|  |  |  ├── build  // 编译相关以及webpack相关配置
|  |  |  |  ├── build.js
|  |  |  |  ├── check-versions.js
|  |  |  |  ├── logo.png
|  |  |  |  ├── utils.js
|  |  |  |  ├── webpack.base.conf.js
|  |  |  |  ├── webpack.dev.conf.js
|  |  |  |  └── webpack.prod.conf.js
|  |  |  ├── config // 配置相关
|  |  |  |  ├── dev.env.js
|  |  |  |  ├── index.js
|  |  |  |  ├── js-jsp-map.js // 配置入口js和jsp的映射
|  |  |  |  └── prod.env.js
|  |  |  ├── package.json // npm配置
|  |  |  ├── src // web项目工程目录
|  |  |  |  ├── pages // jsp页面,最终的jsp文件们会按照pages相对路径打包进webapp/WEB-INF/jsp目录下
|  |  |  |  |  ├── include // 共享的jsp页面,通过jsp:include引入
|  |  |  |  |  |  ├── common_script.jsp
|  |  |  |  |  |  ├── footer.jsp
|  |  |  |  |  |  ├── header.jsp
|  |  |  |  |  |  ├── init.jsp
|  |  |  |  |  |  └── meta.jsp
|  |  |  |  |  ├── index // 页面1
|  |  |  |  |  |  ├── index.js // 需要在在config/js-jsp-map.js配置与jsp的映射关系,这样编译后的js会加载jsp的body下。一般js与jsp在同一个目录下。
|  |  |  |  |  |  └── index.jsp
|  |  |  |  |  └── start // 页面2
|  |  |  |  |     ├── dashboard.css
|  |  |  |  |     ├── index.js
|  |  |  |  |     └── index.jsp
|  |  |     |     └── my-component.vue 支持VUE
|  |  |     ├── polyfills 兼容相关的代码
|  |  |     |  ├── console.js
|  |  |     |  ├── index.js
|  |  |     |  └── promise.js
|  |  |     ├── static // 存在静态文件,最终这些文件会拷贝到webapp目录下
|  |  |     |  ├── favicon.ico
|  |  |     |  ├── images
|  |  |     |  |  ├── jsp.svg
|  |  |     |  |  └── webpack.svg
|  |  |     |  ├── js
|  |  |     |  |  └── lib
|  |  |     |  |     └── jquery.min.js
|  |  |     |  └── WEB-INF
|  |  |     |     ├── tld
|  |  |     |     └── web.xml
|  |  |     └── styles
|  |  └── webapp // 该目录下的文件不用开发人员手动添加修改,在npm run dev或npm run build的时候自动生成。
|  └── test
|     └── java

src/main/js目录下的目录结构是在vue-cli的webpack模板的基础上修改的,如果您使用过该模板创建过项目,那么将很容易会上手。

开发

cd src/main/jsnpm run dev

在idea中启动tomcat

在浏览器中打开http://localhost:8081

以下几点需要注意一下

首次启动项目,建议先npm run dev在启动tomcat。之后其中一个重启,另外一个可以不用重启。 默认情况下npm run dev跑在8081端口下,tomcat跑在8080端口下。最终在浏览器访问只需要访问8081的页面,8080页面没有必要。 开发模式下,js引入的css是动态引入的,页面会出现闪变的效果。不用担心,在发布后的环境中是不会出现的。 开发jsp页面的时候,热部署会有延时,具体参看JSP页面这一章节 开发jsp文件务必在pages目录下开发,切勿在webapp目录下开发。否则在切换到pages目录下开发或者打包后或,webapp下的jsp的文件会被覆盖,导致修改的内容丢失。

打包发布

npm run build

webapp作为输出目录,static中文件会拷贝到输出目录,pages目录下的jsp文件会作为模板文件拷贝到webapp/WEB-INF/jsp目录下,与jsp关联的js入口会被合并压缩后引入到jsp文件的body中。jsp关联的css会被抽离出一个单个的css文件引入的jsp文件head中。

如果您打包后的应用的Application Context不是/, 比如是/app,即访问地址都是基于http://localhost:8080/app,那么打包的时候webpack的publicPath参数记得配置/app,且jsp页面中所有的地址都需要带上${pageContext.request.contextPath}/,在该项目框架中可以简写为${ctx}/

JSP页面

传统的JSP是在src/main/webapp下开发,在这个项目框架下开发jsp文件是在src/main/js/src/pages下开发。虽然开发目录不一致,但依然拥有传统jsp开发所有的特性。

  • 模板嵌套,比如使用<jsp:include page=''></jsp:include>或者<%@include file=""%>
  • el表达式,<c:set>, <c:if>, <c:forEach>等都可以使用
  • 嵌入Java代码 比如使用<% out.println("hello world"); %>
  • 支持热部署。配置好启动tomcat相关参数。在修改完jsp保存文件后,约10秒后刷新页面就可以看到页面的变化。如果等不及10秒或者页面一直不刷新,可以先点击idea菜单File->Syncronize>同步文件(快捷键Ctrl+Alt+Y),然后在点击Run的左侧第三个按钮后选择Update classes and resources手动更新,之后就刷新页面就可以看到最新出的页面。 实际在npm run dev的时候,pages目录下的jsp会作为htmlWebpackPlugin插件的模板文件,每次修改pages下的文件都会被输出到webapp/WEB-INF/jsp下的相对目录。需要了解具体原理,请前往核心章节

自定义标签库

除了标准的c, fmt, fn标签库外,您也可以自定义标签库。

  • 首先在static/WEB-INF/tld新建一个tld,比如elftld
  • 然后jsp页面引入,<%@ taglib prefix="elf" uri="/WEB-INF/tld/elfunc.tld" %>

注意的是,在jsp页面的地址必须以/WEB-INF/开头,而实际开发jsp的路径是在js/src/pages目录下,导致idea无法正常解析pages目录下jsp中tld文件路径,在使用自定义标签的时候也无法自动补全。不过可以正常运行,实际开发过程影响不大。如果您有更好的解决方案,请与我们联系。

语法转换

因为了使用了webpack作为打包工具,您可以轻松对js和css进行语法转换,目前支持:

  • es6, stage-2
  • postcss
  • less, sass, scss 需要额外装对应的loader即可支持

热更新

在开发单页应用的过程中,有一个很棒的特性就是热更新,修改了js文件,页面实时就会触发更新。 在此项目框架下,您依然可以享受到热更新带来的喜悦,在您修改js和css的时候,页面都会实时触发更新。

VUE

该项目已经默认支持Vue。这一章节也是用VUE编写的,你可以尽情的享受VUE带来的编码的快乐。

  • 您可以给idea添加vue.js插件,这样也可以直接使用.vue文件。
  • js和css的语法转换在.vue文件中同样适用。

核心

该项目融合了webpack和jsp两者的特性实现了多页应用,这很酷。那到底是如何实现的呢。这里我们从搭建项目遇到的问题来讲讲最核心的几个问题是如何解决的。

HtmlWebpackPlugin

使用webpack实现多页应用,很容易联想到配置多个entry入口,每一个entry对应一个HtmlWebpackPlugin。jsp文件作为HtmlWebpackPlugin的模板文件,在entry的js在打包之后会插入到body下。该项目也是按照这样的搭建的。 这里有几点需要注意

  • HtmlWebpackPlugin解析jsp文件需要对应的loader,需要在webpack中配置{ test: /\.jsp$/, loader: 'raw-loader' },这里使用raw-loader进行纯文本拷贝。如果您有更适合jsp的loader,那么您可以赋予jsp文件特多的特性。
  • 因为jsp可以被嵌套,这些被嵌套的jsp,并不是入口的jsp。所有只有是入口的jsp在配合HtmlWebpackPlugin插件的会额外添加{inject: ‘body’}参数
  • 那如何规定哪些jsp是入口文件呢?我们是通过配置来约定entry的js与jsp的关联关系,配置文件在config/js-jsp-map.js中。

proxy反代

tomcat是跑在8080端口下的,webpack-dev-server是跑在8081端口下的,是两个不同应用。那岂不是开发jsp要在tomcat下编写调试,开发js在webpack-dev-server调试。这样的话岂不是很麻烦。

庆幸的webpack-dev-server有一个proxy参数,我们利用proxy把访问webpack-dev-server的请求都反代到8080下。这样实际开发过程中浏览器只要打开8081端口页面就可以。这样就做到兼顾jsp服务端渲染的功能,以及webpack语法转换,热更新的功能。tomcat只有在必要的时候重启一下就好。 这里有几点需要注意

  • npm run dev和启动tomcat并没有顺序要求,不过在浏览器访问8081前需要把这两个服务都启动起来。
  • 当涉及到jsp文件有新增删除,或者static目录下的文件有新增编辑删除时,需要重新npm run dev和重启tomcat。记住一点,如果有文件新增和删除,最好都把这两个服务都重启一下肯定是没有问题的。

WriteFilePlugin

我们知道webpack-dev-server是使用内存中的文件系统。而jsp页面最终是要发布到tomcat的,内存中的jsp文件并不能被idea监听,这样即使最终输出的jsp发生改变也无法被deploy到tomcat。 庆幸我们找到了一个webpack的插件WriteFilePlugin,它能强制把webpack-dev-server程序的输出的文件写到磁盘文件系统上。 这里有几点需要注意

  • 虽然通过WriteFilePlugin的jsp文件输出到磁盘上了,但是因为不是通过idea直接修改,idea还是无法立刻同步这些文件。idea同步并发布jsp文件会有10s的延迟。如果等不及10秒或者页面一直不刷新,可以先点击idea菜单File->Syncronize>同步文件(快捷键Ctrl+Alt+Y),然后在点击Run的左侧第三个按钮后选择Update classes and resources手动更新,之后就刷新页面就可以看到最新出的页面。

结语

这个思路其实不仅适用tomcat下的jsp多页应用,同样也是适用node作为服务器的多页应用。Enjoy it!

mongodb 几百kb document 请求返回过慢优化

$
0
0

在我的个人博客后台系统,去拉取文章列表的时候,由于返回的document 有几百k, 足足用了10s. 单个文章的document 也有可能上百kb。这种情况下,mongodb有什么相应的优化或提高性能的办法么。是否可以通过document gzip 处理? WechatIMG449.jpeg

深入理解React源码 V (英文)

Napa.js有人用过没?

【JavaScript 基础知识】一篇关于 JavaScript 一些知识点的总结 —— 持续更新

$
0
0

JavaScript 中基础数据类型

数据类型名称数据类型说明
Undefined只有一个值,即 undefined,声明变量的初始值。
Null只有一个值,即 null,表示空指针,undefined的值是派生 null的值。
String由零或多个 16 位 Unicode字符组成
Boolean只有两个值,即 truefalse
Number该类型使用 IEEE754来表示整数和浮点数。
ObjectECMAScript 中的对象其实就是一组数据和功能的集合。
SymbolES6 中新加入的数据类型,表示独一无二的值。

其中 Object类型包含 FunctionArrayDateRegExp

JavaScript 中的内置对象

对象名称对象说明
Arguments函数参数集合
Array数组
Boolean布尔对象
Date日期对象
Error异常对象
Function函数构造器
Math数学对象
Number数值对象
Object基础对象
String字符串对象

typeof null返回结果为 'object'

  从逻辑上来看,null值表示一个空对象指针,因此会返回一个 'object',也可以理解为是 JavaScript 早期的一个BUG,而现在标准就是这样规范的。V8曾经修正并实现过typeof null === 'null',但最终证明不可行。http://wiki.ecmascript.org/doku.php?id=harmony:typeof_null

Array对象方法与作用

方法名称对象说明
concat用于连接两个或更多的数组并返回结果,arr1.concat(arr2)
join把数组的所有元素放入一个字符串,元素通过制定的分隔符进行分离 arr1.join(',')
pop删除并返回数组中的最后一个元素 arr1.pop()
push向数组的末尾添加一个或更多元素,并返回新的长度 arr1.push(1)
reverse颠倒数组中的元素顺序,arr1.reverse()
shift删除并返回数组中的第一个元素 arr1.shift()
slice从某个已有的数组返回指定的元素
sort对数组的元素进行排序 arr1.sort()
splice删除元素,并向数组中添加新元素
toString把数组转成字符串 arr1.toString()
toLocaleString把数组转换为本地字符串 arr1.toLocaleString()
valueOf返回数组对象的原始值

typeof可能的返回值

类型返回结果
Undefined“undefined”
Null“object”
Boolean“boolean”
Number“number”
String“string”
Symbol (ECMAScript 6 新增)“symbol”
宿主对象(由JS环境提供)Implementation-dependent
函数对象([[Call]] 在ECMA-262条款中实现了)“function”
任何其他对象“object”

上述来自 MDN

对文章有不正确之处,请给予纠正。github 文章请顺手给个 Star,最后感谢您的阅读。

twitter面试题之装水问题:NodeJS版本

$
0
0

问题介绍引自Python版本

题目描述

看下面这个图片,在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[2,5,1,2,3,4,7,7,6],假如开始下雨了,那么墙之间的水坑能够装多少水呢?”

以1×1的方块为单位计算容积。所以,在上边的图中下标为1以左的都会漏掉。下标7以右的也会漏掉。剩下的只有在1和6之间的一坑水,容积是10。如下图所示。

分析

原文作者最初想法是用极大值考虑,也就是说找到下标2的左右两个极大值,但是这个做法最后作者意识到是错误的。比如下面的情况就不对: 看看这个输入:

286774-7d71e9846e42fe3c.jpg

如果答案计算的是极大值之间的水,就像这样。

286774-0477dab12c584826.jpg

但是答案应该是在两个高塔之间只有一池水: 286774-b9c4ef8f7288573e.jpg那其实正确的解法是作者后来灵光一闪想到的,确实看起来很简单。这其实要基于一个事实那就是,你从左往右扫描数组的时候,只要是左边最大值小于右边的数字时,这中间是一定可以存储水的。每次维护一个左墙的最大值,从左向右的扫描过程中遇到大于左边最大值的值,则更新左边最大值,并且不增加存储水的容量,因为在从左往右扫描的过程中,如果遇到的值比左边大,那么存储不了水,如上面例子中从2开始扫描,遇到5的时候,此时存储容量还是0,因为5大于2,这中间存储不了水。从右往左扫描也是一样。 一个基本的解法就是先找到数组最大值,然后从左往右扫描到最大值,计算出水的容量;然后从右往左扫描到最大值,计算出水的容量,最后总的容量就是两部分之和。

描述还是会不怎么清楚,还是以例子来看。以第一个例子[2,5,1,2,3,4,7,7,6]来看,最大值为7,两个7随便选后面一个好了。那么从左往右扫描过程如下:

1)首先设置左边最大值为2,容量设置为0。 2)2小于7,往右继续扫描,遇到5,因为5大于2,所以更新左边最大值为5,此时并不更新存储水的容量,接着往后扫描。 3)扫描到1,因为1比前面的5小,因此现在至少可以存储5-1=4单位水。存储水的容量加4。因为我们知道右边有比左边最大值还大的值,所以肯定是可以至少存储这么多水的。 4)接着扫描到2,还是比5小,存储水的容量增加5-2=3,容量变为4+3=7. 5)继续扫描到3,还是比5小,存储水的容量增加5-3=2,容量变为7+2=9. 6)继续扫描到4,还是比5小,存储水的容量增加5-4=1,容量变为9+1=10. 可以得到左侧存储水的容量为10。同理,从右往左扫描到7,容量为0,因为6小于7,7以右的水全部会漏掉。 那么一个更优的解法其实是只需要扫描一遍就OK,不需要之前扫描数组找最大值,也就是整合了左右扫描的过程。如果左边值小于右边值,则从左往右扫描,否则从右往左扫描。)

直接上代码

let calculate = function(arry) {
    let max = [arry.shift(), arry.pop()]; // 0 最左 1 最右
    let result = 0; // 结果

    while (arry.length > 0) {
        
        // 从最小的一边遍历,取值结果小与最值则累加,大于最值则同步最值
        let short = max[0] < max[1] ? 0 : 1,
            current = short ? arry.pop() : arry.shift();

        if (current > max[short])
            max[short] = current;
        else
            result += max[short] - current;
    }

    return result;
}

mongoose中间件使用时的疑惑

$
0
0

在用到pre(‘findOneAndUpdate’,function(next) {…})时,从回调的this里面获取到的字段是undefined,如果schema定义了字段meta,然后在执行findOneAndUpdate操作后,pre操作中回调获取this.meta是undefined,目前对mongoose还不太熟,不知从何分析

搭建P2P网络的原理

$
0
0

最近在研究P2P技术,奈何相关资料不多,自己琢磨了一下,分享一下学习P2P的一些原理, 以及如何打造一个P2P聊天应用。

这里指的P2P是指peer to peer, 点对点的技术, 每个客户端都是服务端,没有中心服务器,不是websocket针对某个connection推送消息。

技术要点

  • udp协议
  • 节点之间的建立,连接和广播
  • 内网穿透,如何能让两个处在内网的节点,相互发现自己的存在,并且建立通信

原理

首先解决的是内网穿透的问题,常见的底层协议tcp,udp,他们各自有优缺点,简单说明一下。 tcp:需要处理粘包问题,双工流通道,是可靠的链接。 udp: 每次发送的都是数据包,没有粘包问题,但是连接不可靠,只能传输少量数据

更加详细的请Google

这里选择udp协议,简单一些。

再下来是内网穿透,先说结论: 两个处于不同内部网络的节点,永远无法发现他们之间的相互存在,你就算是想顺着网线过去打他都不行。

所有的内网穿透原理无外乎需要一个有公网ip的中介服务器,包括虚拟货币像比特币之类的,所以首先要有一个创世节点

在NodeJS中,创建udp服务也很简单

const dgram = require("dgram");
const udp = dgram.createSocket("udp4");
udp.bind(1090, callback)

把服务部署要公网,那么其他所有的节点都能访问,通过中转服务器,能够使得两个节点可以建立连接

节点.png

我们是要建立这样的P2P网络

网络.png

假如现在只有3个节点: 创世节点, B节点, C节点, 创世节点有公网IP

我用对话的形式,阐述他们建立链接的过程:

B节点: hey,创世节点,我要加入到P2P网络里面,告诉其他兄弟,我来了 创世节点: 兄弟们,刚刚有个叫做B的节点加入网络了,你们也去告诉其他节点 其他节点: 刚刚收到来自 "创世节点"的通知,有个fresh meet加入网络了,叫做 “B”

… 至此,所有人都知道了B节点加入了网络,里面记载着B节点的相关信息,包括IP地址,包括udp端口号

此时C节点也要加入网络,并且想要和B节点对话:

C节点: hey,创世节点,我要加入到P2P网络里面,并且我要和B对话 创世节点: 兄弟们,刚刚有个叫做B的节点加入网络了,你们也去告诉其他节点,顺便看看有没有B这个节点 其他节点: 刚刚收到来自 "创世节点"的通知,有个fresh meet加入网络了,叫做 “C”,你们也看看有没有B这个节点 其他节点2: 收到通知,听说一个叫做C的节点在找一个B节点,我这里有它的信息,ip是xxxx.xxxx.xxx.xxxx, 端口10086 B节点: 有个C的家伙(ip: xxxx.xxxx.xxxx.xxxx, 端口1000)要找我

到这里,B获取到了C的信息,包括IP和端口,C也拿到了B的信息.

于是,他们两个就可以建立通信。消息流: B <----> C. 中间不经过任何服务器

用一张图来形容:

new.png

总结

在设计中,每个节点的功能都是一样的。如果需要加入到网络中,不一定跟创世节点链接

假设已存在的节点: 创世节点,A、B、C节点,此时有个D节点想要加入到网络。

那么D节点不一定非得链接到创世节点,可以链接到A、B、C中的任意一个节点,然后该节点再广播给其他节点说"Hey, 有个新人叫做D的加入了网络"。

这样所有人都知道,有个叫做D的节点存在,你可以和它通信,同时D节点和会同步已存在的节点。这样D节点也知道了其他节点的存在了。

最后

基于这一原理,可以打造出一个P2P的聊天应用,没有中间商赚差价。

这只是一些基本原理,离实际应用还差很多,有很多坑,比如D节点退出网络之后,要广播 “D节点退出网络了,把这个节点注销了吧,这波没他",还有消息加密,通信的双向验证(A节点想要B节点通信,但是不需要B节点的同意)等等,坑太多,填不完

原计划是搭建这么一个网络,然后写个electron的聊天应用,但是精力有限,就这样了。代码(写的丑,轻拍)

文字功底有点差,表述不清楚,见谅,如文中有误,欢迎指正与交流。

年后正在找一份NodeJS的工作,坐标深圳,哪里能投递

RESTful接口定义 对于相同实体的查询接口 后台管理员和用户的接口分别如何定义?

$
0
0

举例: 前提:系统有三方 1. 运营方、2. 店铺(B端用户)3. 用户(C端用户) 用户进行下单操作 接口定义: 查询订单详情接口: To B: /sellers/:sellerId/orders/:orderId To C: /buyers/:buyerId/orders/:orderId 问题: 对于订单的这样的实体好解释,订单可以是用户的也可以是属于店铺的。如果只有运营平台和买方,运营平台查询一个商品信息可以是/items/:itemId,用户查看也是/items/:itemId。查询出来的信息,应该是运营平台要多一些,类似商品的销售提成这样的信息。如何定义RESTful路由?

请教一条mongodb查询语句

$
0
0

查询要求如下:

  1. 搜索标签字段(数组类型,形如tag:[“好看”,“大气”,“高个子”]),如果用户输入了搜索条件就按条件搜索,如果没输入就搜索返回所有数据
  2. 不准用$OR(这里简化了真实场景,真实场景中无法用$or)
  3. 数据库中用户名字段,存在空值

jasmine 可以dubug吗,如何debug

$
0
0

jasmine 可以dubug吗,如何debug

Viewing all 14821 articles
Browse latest View live