NodeJS代码组织与部署

  使用NodeJS编写程序前,为了有个良好的开端,首先需要准备好代码的目录结构和部署方式,就如同修房子要先搭脚手架。本章将介绍与之相关的各种知识。

一、模块路径解析规则

  我们已经知道,require函数支持斜杠(/)或盘符(C:)开头的绝对路径,也支持./开头的相对路径。但这两种路径在模块之间建立了强耦合关系,一旦某个模块文件的存放位置需要变更,使用该模块的其它模块的代码也需要跟着调整,变得牵一发动全身。因此,require函数支持第三种形式的路径,写法类似于foo/bar,并依次按照以下规则解析路径,直到找到模块位置。

1、内置模块

  如果传递给require函数的是NodeJS内置模块名称,不做路径解析,直接返回内部模块的导出对象,例如require(‘fs‘)

2、node_modules目录

  NodeJS定义了一个特殊的node_modules目录用于存放模块。例如某个模块的绝对路径是/home/user/hello.js,在该模块中使用require(‘foo/bar‘)方式加载模块时,则NodeJS依次尝试使用以下路径。

/home/user/node_modules/foo/bar
/home/node_modules/foo/bar
/node_modules/foo/bar

3、NODE_PATH环境变量

  与PATH环境变量类似,NodeJS允许通过NODE_PATH环境变量来指定额外的模块搜索路径。NODE_PATH环境变量中包含一到多个目录路径,路径之间在Linux下使用:分隔,在Windows下使用;分隔。例如定义了以下NODE_PATH环境变量:

NODE_PATH=/home/user/lib:/home/lib

  当使用require(‘foo/bar‘)的方式加载模块时,则NodeJS依次尝试以下路径。

/home/user/lib/foo/bar
/home/lib/foo/bar

二、包(package)

  我们已经知道了JS模块的基本单位是单个JS文件,但复杂些的模块往往由多个子模块组成。为了便于管理和使用,我们可以把由多个子模块组成的大模块称做,并把所有子模块放在同一个目录里

  在组成一个包的所有子模块中,需要有一个入口模块,入口模块的导出对象被作为包的导出对象。例如有以下目录结构。

- /home/user/lib/
    - cat/
        head.js
        body.js
        main.js

// 其中cat目录定义了一个包,其中包含了3个子模块。
// main.js作为入口模块,其内容如下:
var head = require(‘./head‘);
var body = require(‘./body‘);

exports.create = function (name) {
    return {
        name: name,
        head: head.create(),
        body: body.create()
    };
};

  在其它模块里使用包的时候,需要加载包的入口模块。接着上例,使用require(‘/home/user/lib/cat/main‘)能达到目的,但是入口模块名称出现在路径里看上去不是个好主意。因此我们需要做点额外的工作,让包使用起来更像是单个模块。

1、index.js

  当模块的文件名是index.js,加载模块时可以使用模块所在目录的路径代替模块文件路径,因此接着上例,以下两条语句等价。

var cat = require(‘/home/user/lib/cat‘);
var cat = require(‘/home/user/lib/cat/index‘);

  这样处理后,就只需要把包目录路径传递给require函数,感觉上整个目录被当作单个模块使用,更有整体感。

2、package.json

  如果想自定义入口模块的文件名和存放位置,就需要在包目录下包含一个package.json文件,并在其中指定入口模块的路径。上例中的cat模块可以重构如下。

- /home/user/lib/
    - cat/
        + doc/
        - lib/
            head.js
            body.js
            main.js
        + tests/
        package.json

  其中package.json内容如下。

{
    "name": "cat",
    "main": "./lib/main.js"
}

  如此一来,就同样可以使用require(‘/home/user/lib/cat‘)的方式加载模块。NodeJS会根据包目录下的package.json找到入口模块所在位置

三、NPM

  NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:

  • 允许用户从NPM服务器下载别人编写的三方包到本地使用。
  • 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
  • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

  可以看到,NPM建立了一个NodeJS生态圈,NodeJS开发者和用户可以在里边互通有无。以下分别介绍这三种场景下怎样使用NPM。

  npm install 包名,可以在包名后边加上@<version>来下载指定版本

  NPM对package.json的字段做了扩展,允许在其中申明三方包依赖

1、npm发布代码

  第一次使用NPM发布代码前需要注册一个账号。终端下运行npm adduser,之后按照提示做即可。账号搞定后,接着我们需要编辑package.json文件,加入NPM必需的字段。接着上边node-echo的例子,package.json里必要的字段如下。

{
    "name": "node-echo",           # 包名,在NPM服务器上须要保持唯一
    "version": "1.0.0",            # 当前版本号
    "dependencies": {              # 三方包依赖,需要指定包名和版本号
        "argv": "0.0.2"
      },
    "main": "./lib/echo.js",       # 入口模块位置
    "bin" : {
        "node-echo": "./bin/node-echo"      # 命令行程序名和主模块位置
    }
}

  之后,我们就可以在package.json所在目录下运行npm publish发布代码了。

2、这里再介绍一些NPM常用命令。

  • NPM提供了很多命令,例如installpublish,使用npm help可查看所有命令。
  • 使用npm help <command>可查看某条命令的详细帮助,例如npm help install
  • package.json所在目录下使用npm install . -g可先在本地安装当前命令行程序,可用于发布前的本地测试。
  • 使用npm update <package>可以把当前目录下node_modules子目录里边的对应模块更新至最新版本。
  • 使用npm update <package> -g可以把全局安装的对应命令行程序更新至最新版。
  • 使用npm cache clear可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人。
  • 使用npm unpublish <package>@<version>可以撤销发布自己发布过的某个版本代码。

小结:

  • 编写代码前先规划好目录结构,才能做到有条不紊。
  • 稍大些的程序可以将代码拆分为多个模块管理,更大些的程序可以使用包来组织模块。
  • 合理使用node_modulesNODE_PATH来解耦包的使用方式和物理路径。
  • 使用NPM加入NodeJS生态圈互通有无。
  • 想到了心仪的包名时请提前在NPM上抢注。

原文地址:https://www.cnblogs.com/goloving/p/11415656.html

时间: 2024-10-08 08:21:31

NodeJS代码组织与部署的相关文章

Node.js学习笔记【3】NodeJS基础、代码的组织和部署、文件操作、网络操作、进程管理、异步编程

一.表 学生表 CREATE TABLE `t_student` ( `stuNum` int(11) NOT NULL auto_increment, `stuName` varchar(20) default NULL, `birthday` date default NULL, PRIMARY KEY  (`stuNum`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 学生分数表 CREATE TABLE `t_stu_score` ( `id` int(11

windows下《七天学会NodeJS》学习笔记之二--代码的组织和部署

本系列第一篇:<windows下<七天学会NodeJS>学习笔记之一--NodeJS基础>,请参见这儿:http://blog.csdn.net/fm2005/article/details/41348813 模块路径解析规则:nodejs支持三种解析方式:/或C:开头的绝对路径:./开头的绝对路径:按照一定规则解析路径,直到找到模块位置. 内置模块:如果传递给require的是NodeJS内置模块名称,则不解析,直接返回内部模块导出对象. node_modules目录:node_

nodejs实践-代码组织

[email protected] Contents 1.?代码组织 1.?代码组织 更新版本 npm install -g n n latest 项目文件组织 MVC 前后端代码的分离 清晰明了的组织项目代码 水平文件夹结构: 按文件角色组织 C一组 垂直文件夹结构 按照文件功能组织 项目初始化: 规范的package.json文件 bower.json 模块化: 使用文件 使用函数 module.exports exports 后端项目实践 npm init 一步步输入参数,会创建packa

如何搭建轻量级架构-代码组织篇

很多程序员看到标题,估计心里一愣:一个组织代码,有什么可讲的,无非是公司网址倒着写,外加命名规范,最多分模块管理而已!怎么这都能忽悠一篇文章来? 代码组织确实是一件简单的事情,但是如果我说的"代码组织"不仅仅限于这些内容呢... 大家都知道Web项目的架构,文件很琐碎.一个模块前台包含JS,CSS,HTML文件,后台还有模块的逻辑处理类,实体的数据库访问类,以及实体本身. 如果这个模块需要打印,还要有打印的模板文件! 如果这个模块还有一些关联数据,比如学员的学分数据等等. 算下来,一个

怎样搭建轻量级架构-代码组织篇

非常多程序猿看到标题,预计心里一愣:一个组织代码,有什么可讲的,无非是公司网址倒着写,外加命名规范,最多分模块管理而已!怎么这都能忽悠一篇文章来? 代码组织确实是一件简单的事情.可是假设我说的"代码组织"不只限于这些内容呢... 大家都知道Web项目的架构,文件非常琐碎.一个模块前台包括JS,CSS,HTML文件,后台还有模块的逻辑处理类,实体的数据库訪问类.以及实体本身. 假设这个模块须要打印,还要有打印的模板文件! 假设这个模块另一些关联数据,比方学员的学分数据等等. 算下来.一个

GO1.6语言学习笔记2-安装配置及代码组织

一.关于GO开发环境的安装和配置 在linux环境中安装编译好的go安装包,参考官方指南的步骤一步步走下来就可以了.需要注意的是以下几个环境变量的配置: GOROOT - go编译库的目录,类似于java的JAVA_HOME PATH - 注意把$GOROOT/bin添加上去 GOPATH - go工作目录,类似于eclipse的workspace 以下是具体的安装步骤和环境配置        $ wget https://storage.googleapis.com/golang/go1.6.

3分钟干货学会使用node-inspector调试NodeJS代码

使用node-inspector调试NodeJS代码 任何一门完备的语言技术栈都少不了健壮的调试工具,对于NodeJS平台同样如此,笔者研究了几种调试NodeJS代码的方式,通过对比,还是觉得node-inspector的调试方式比较方便,而且和前端JavaScript代码的调试具有一致的体验,不仅健壮,而且方便.安装完成NodeJS后执行如下指令可以完成node-inspector安装. >npm install -g node-inspector node-inspector安装完成以后运行

第一部分 代码组织概念,集成开发环境(IDE)

代码组织概念 主要是代码文件,项目和解决方案. 解决方案(.sln)包含多个项目(.csproj),一个项目又包含多个文件(.cs). 集成开发环境(IDE): 由编辑.编译.调试,以及用户图形界面,集成编写,分析,编译,调试等等集成一体化开发程序. 软件名称:Visual Studio 官网下载:https://www.visualstudio.com/

从HTML看代码组织与优化

随着Web2.0概念的普及和W3C组织的推广,人们对用户体验的要求越来越高,前端开发难度越来越大,前端开发工程师这一职业终于总设计和制作部分的局面中独立出来.随之而来的是对代码可读性要求的提高,编写高质量代码逐渐成为前端开发工程师不可或缺的一项技能.这里根据资料整理了一些HTML相关代码编写规范. 网页语义 根据web内容的不同含义或场景,选择合适的标签(代码语义化)来承载内容,便于开发者阅读和写出更优雅的代码的同时,让浏览器的爬虫和机器很好地解析.比如一段普通纯文本,可以使用P标签,但如果文本