版本控制###

版本控制有以下益处:

  • 文档: 能够回溯项目的历史,回顾所做的决策及组件的开发顺序,可形成宝贵的文档。记录项目的历史是十分有价值的。
  • 归属: 团队工作,分工清晰,节省沟通成本。
  • 试验: 你可以引出一个分支,尝试做一些新的东西,不用担心会影响项目的稳定性。

使用Git###

  • 初始化 git init**

  • 创建一个.gitignore文件**

node_modules
*~
.DS_Store

.gitignore文件中的条目也适用于子目录。

  • 添加修改 git add -A

它添加的是修改,而不是文件。

  • 提交 git commit -m "Initial commit."

npm包###

永远不要修改node_modules目录中的任何代码; 如果想对项目所依赖的包进行修改,正确的做法应该是创建那个项目的副本。

  • package.json

package.json文件有双重作用:描述项目和列出依赖项。

{
"dependencies": {
"express": "^4.0.0",
"express3-handlebars": "^0.5.0"
}
}

包版本号之前的插入符(^),这表明在下一个主要版本号之前,所有以指定版本号开始的版本都能用。(4.0.0-4.9.9); 这是使用npm install --save时默认指定的版本范围,并且通常也很安全。

如果你想了解npm中更多与版本有关的信息,可以翻阅一下semver的文档

项目元数据###

package.json文件的另一个作用便是存放项目的元数据。可以用npm init来初始化创建package.json文件。如果想把项目放到npm或Github上,则对元数据的要求会比较严格。

想了解更多有关package.json中各个域的信息,请查阅package.json的文档

另一个重要的元数据是README.md文件。这个文件很适合描述网站的整体架构,也适合于存放刚接触项目的人需要了解的重要信息。这个文件是用基于Markdown的文本维基格式写成的。

更多信息请查阅Markdown文档

Node模块###

Node模块和npm包是两个相互关联但又彼此不同的概念。Node模块提供了一个模块化和封装的机制。npm包则提供了一种存储、版本化和引用项目(不限于模块)的标准范式。

var express = require('express');

require是一个用来引入模块的Node函数。Node默认会在目录node_modules中寻找这些模块。然而Node还提供了创建自有模块的机制(永远不要在node_modules中创建自己的模块)

创建一个模块

  • 创建一个用来保存模块的目录,一般都称为lib;这个目录下创建一个fortune.js文件:
var fortuneCookies = [
"Conquer your fears or they will conquer you.",
"Rivers need springs.",
"Do not fear what you don't know.",
"You will have a pleasant surprise.",
"Whenever possible, keep it simple.",
]; exports.getFortune = function() {
var idx = Math.floor(Math.random() * fortuneCookies.length);
return fortuneCookies[idx];
};

这里要特别注意全局变量输出的用法。如果你想让一个东西在模块外可见,必须把它加到exports上。在这个例子中,在模块外可以访问到函数getFortune,但数组fortuneCookies是完全隐藏起来的。

  • 在原来的meadowlark.js中移除fortuneCookies数组,并在顶部加上下面这行代码:
var fortune = require('./lib/fortune.js');

在模块名称前加了前缀./。这是告诉Node,它不应该到node_modules目录中查找这个模块,如果我们忽略了这个前缀就会导致失败。

  • 接下来在关于页面的路由中,利用以上模块里的getFortune方法:
app.get('/about', function(req, res) {
res.render('about', { fortune: fortune.getFortune() } );
});

了解更多信息,请参考Node模块的官方文档

express-3 最佳实践的更多相关文章

  1. nodejs 实践:express 最佳实践 (一)

    express 最佳实践 (一) 最近,一直在使用 nodejs 做项目,对 nodejs 开发可以说深有体会. 先说说 nodejs 在业务中的脚色,, 在 web同构 方面, nodejs 的优势 ...

  2. express 最佳实践(二):中间件

    express 最佳实践(二):中间件 第一篇 express 最佳实践(一):项目结构 express 中最重要的就是中间件了,可以说中间件组成了express,中间件就是 express 的核心. ...

  3. nodejs 实践:express 最佳实践(四) express-session 解析

    nodejs 实践:express 最佳实践(四) express-session 解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs ...

  4. nodejs 实践:express 最佳实践系列

    nodejs 实践:express 最佳实践系列 nodejs 实践:express 最佳实践(一) 项目结构 nodejs 实践:express 最佳实践(二) 中间件 nodejs 实践:expr ...

  5. nodejs 实践:express 最佳实践 (一) 项目结构

    express 最佳实践 (一) 第二篇: express 最佳实践(二):中间件 最近,一直在使用 nodejs 做项目,对 nodejs 开发可以说深有体会. 先说说 nodejs 在业务中的脚色 ...

  6. nodejs 实践:express 最佳实践(二) 中间件

    express 最佳实践(二):中间件 第一篇 express 最佳实践(一):项目结构 express 中最重要的就是中间件了,可以说中间件组成了express,中间件就是 express 的核心. ...

  7. nodejs 实践:express 最佳实践(三) express 解析

    nodejs 实践:express 最佳实践(三) express 解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的基础不稳固, ...

  8. nodejs 实践:express 最佳实践(五) connect解析

    nodejs 实践:express 最佳实践(五) connect解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的基础不稳固,需 ...

  9. nodejs 实践:express 最佳实践(六) express 自省获得所有的路由

    nodejs 实践:express 最佳实践(六) express 自省获得所有的路由 某些情况下,你需要知道你的应用有多少路由,这在 express 中没有方法可以.因此我这边曲线了一下,做成了一个 ...

  10. nodejs 实践:express 最佳实践(七) 改造模块 connect2 解析

    nodejs 实践:express 最佳实践(七) 改造模块 connect2 解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的 ...

随机推荐

  1. eclipse修改项目名称

    一. 右键工程:Refactor->Rename,或选中工程按F2,修改名称二.右键工程:Properties->Web Project Settings,修改Context Root 三 ...

  2. UICollectionView cellForItemAtIndexPath 方法不走

    在storyboard 中 UICollectionView cellForItemAtIndexPath not called 被坑了好久,各种问题点查找,终于解决了 解决办法: self.auto ...

  3. mongochef如何链接有权限的mongodb3.x数据库

    废话不多说,直接上图: 1.打开mongochef 2.打开的界面是这样的: 3.点击connect,上图红色框中的按钮,不要点下拉三角 4.点击New Connection按钮 5.1:上图标注1, ...

  4. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(四) 之 用户搜索(Elasticsearch),加好友流程(1)。

    前面几篇基本已经实现了大部分即时通讯功能:聊天,群聊,发送文件,图片,消息.不过这些业务都是比较粗犷的.下面我们就把业务细化,之前用的是死数据,那我们就从加好友开始吧.加好友,首先你得知道你要加谁.L ...

  5. 比较原声socket 、GCDAsyncSocket

    原声socket NSInputStream 输入流(OC)NSOutputStream 输出流(OC)1:通过c语言的输入输出流CFReadStreamRef/CFWirteStreamRef(输入 ...

  6. Spring 注释 @Autowired 和@Resource

    一. @Autowired和@Resource都可以用来装配bean,都可以写在字段上,或者方法上. 二. @Autowired属于Spring的:@Resource为JSR-250标准的注释,属于J ...

  7. hdu 2602

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 #include<cstdio> #include<iostream> ...

  8. 自定义log日志

        Log.cs (这个已经不能用了,用下面的问题解决方案) using System; using System.Collections.Generic; using System.Web; u ...

  9. Kl 证明 凸函数

    回到随机变量传输问题,假设传输中我们不知道具体 分布情况(unknown),我们用一个已知的分布 ,来模拟它,那么在这种情况下如果我们利用 尽可能高效的编码,那么我们平均需要多少额外的信息量来描述x呢 ...

  10. ASP.NET Web API 配置返回的json字段的格式以及Action返回HttpResponseMessage类型和IHttpActionResult类型

    1. 对于返回的Json对象格式是以“帕斯卡”风格的(例如“FirstName”),然而我们的Api有很大的可能被带有Javascript的客户端消费,对于JS开发者来说可能更适合“驼峰”风格(例如” ...