Skip to content

Instantly share code, notes, and snippets.

@wuhaixing
wuhaixing / views_in_keystone.md
Last active October 4, 2020 10:43
How to Construct Yourself UI in KeystoneJS

#How to Construct Yourself UI in KeystoneJS

KeystoneJS provide Admin UI with one set of route controllers and view templates(list&item) for all of the models.But usually,you will need some custome views other than Admin UI to display models. Although the KeystoneJS documention don't tell us much about how to contruct custome view,we can learn this from the source code in skeleton project generated by yo keystone,or you can just check out the keystone demo project's source code.We will walk through the blog feature's implementation in this demo application to demonstrate how to construct custome UI in KeystoneJS application.

As KeystoneJS documention described in Routes & Views section,there is a routes/index.js file, where we bind application's URL patterns to the controllers that load and process data, and render the appropriate template.You can find following code in it:

app.get('/blog/:catego

#How does KeystoneJS render it's Admin UI

KeystoneJS is an open source framework for developing database-driven websites, applications and APIs in Node.js. It's built on Express and MongoDB.The easiest way to get started with KeystoneJS is to use Yeoman Generator.yo keystone will scaffold a new KeystoneJS project for you, and offer to set up blog, gallery, and enquiry (contact form) models + views.If you'd like to try the demo at first,here it is.

When I wrote this,keystone's stable version is 0.2.39,and 0.3.0 not published yet,so if you have a different version of KeystoneJS,the content maybe different.

##Generate a KeystoneJS Project

First up, you'll need Node.js >= 0.10.x and MongoDB >= 2.4.x installed. Then, install the Keystone generator:

#快乐Node码农的十个习惯

从问世到现在将近20年,JavaScript一直缺乏其它有吸引力的编程语言,比如Python和Ruby,的很多优点:命令行界面,REPL,包管理器,以及组织良好的开源社区。感谢Node.js和npm,现如今的JavaScript鸟枪换炮了。Web开发者有了强大的新工具,接下来就看他们的想象力了。

下面这个提示和技巧清单,能让你和你的node程序保持快乐。

##1. 用npm init开始新项目

npm有个init命令,可以引导你完成创建package.json文件的过程。即便你非常熟悉package.json和它的属性,也可以把npm init当作将你的新程序或模块导入正轨的简便办法。 它可以聪明地为你设置默认值,比如通过上层目录的名称推断模块名,从~/.npmrc中读取创作者的信息,以及用你的git设置确定代码库。

@wuhaixing
wuhaixing / node.js_v0.12-execsync-a-synchronous-api-for-child-processes.md
Last active March 18, 2019 05:16
ShellJS给Node.js添加了一个编写shell脚本的用处,但Node.js的异步I/O对shell脚本来说是块难啃的骨头。ShellJS虽然找到了办法,但效率低下又丑陋不堪。所以Node.js的核心团队决定让Node v0.12支持同步运行子进程

#Node.js V0.12新特性之给子进程的同步API

尽管发明Node.js的初衷主要是为了编写Web服务器,但开发人员又发现了其他适用(和不适用!)Node的用途。令人觉得惊喜的是,这些用途中有一个是编写shell脚本。并且那确实有意义:Node的跨平台支持已经相当好了,既然前端和后端都用JavaScript写了,如果构建系统也用JavaScript写不是更好吗,对吧?

##异步对shell脚本的坏处

在这一用途上值得称道的库是Grunt,它是构建在ShellJS之上的。然而ShellJS有一块硬骨头要啃:Node迫使它用异步I/O。尽管对于Web服务器来说异步I/O很棒,因为它必须随时做出响应,但对于需要逐步执行的shell脚本来说,异步I/O意义不大。

所以,ShellJS的作者们发现了一个“有趣的”解决办法,让它可以运行一个shell命令,然后等着命令完成。大致上是下面这样的代码:

@wuhaixing
wuhaixing / node.js_v0.12-multiple-context-execution.md
Last active July 20, 2016 05:01
Node.js V0.12新特性之在单进程中跑多个实例

#Node.js V0.12新特性之在单进程中跑多个实例

经常有人提出,希望Node.js能被嵌入到其他程序中,特别是让它能跟其他事件循环整合而且(与此同时)支持多个Node执行情境:也就是说让多个Node实例在同一个进程中和平共处的能力。想象一下,比如有个node-webkit 程序,每个窗口都运行在自己的Node实例上,各窗口彼此相互独立。或者把Node嵌在手机或网络交换机里,处理多连接的路由逻辑,但却只是在单个进程中,并且不久的将来就能实现。

一个客户找到我们,说他们的程序需要这类功能。他们经过调研,肯定了我们在Node核心和libuv上的贡献和专业能力,决定请我们帮忙。这是个相当有挑战性的订单,因为Node一开始就是-并且现在仍然是-一个单线程的程序,围绕着单一事件循环的概念构建,用上百个全局变量存放各种状态。

你可以想象一下,在这样的代码库上加装线程安全是多么容易出错的任务,所以那不是我们要做的-或者说我们还没那么做。我们希望这个修改对客户来说经济实惠,并且向前迈出这一步也能帮到整个社区。顺便说一下,如果你发现自己需要对Node做些修改,可自己又没时间研究该怎么改,我们可以帮忙!

##引入多情境

#Meteor为增强扩展性弃用轮询和差异机制

一直活跃在Meteor社区的Tom Coleman最近发表了一篇文章:扩展Meteor:实时程序的挑战,介绍了Meteor为增强扩展性而在实时处理机制上作出的调整。自2012年Meteor问世以来,人们就在询问它的扩展性如何。虽然Meteor的实时处理特性很吸引人,但人们也很关心它的处理能力,关心它能否驾驭得了更多资源。

Tom Coleman在他的这篇文章中介绍了传统的、单页的和实时的三种不同的web程序模型,并指出三种模型实现扩展性时所面临的问题也是不同的;阐述了轮询和差异机制的处理特点及不足;接着又讲解了Meteor采用的新机制:Oplog tailing,以及这种机制的源起和优势;最后又给出了一些增强程序扩展性的策略性建议。同时他也提醒说:“... Meteor的扩展性领域仍处于快速变化的状态下,所以在这个主题上很难做到盖棺定论 ”。

最后,在一个实时的单页程序中(比如Meteor程序),客户端不仅能请求更多数据,服务器还可以把数据推送给客户端 (比如当数据库中的数据发生变化时)。
这引发了一些有趣的问题:服务器怎么知道数据什么时候发生了变化?还有,服务器怎么知道该把那些变化发送给哪个用户?这些问题是掌握实时程序性能特点的关键。