模块

require(函数)

  • 用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象。
  • 模块名可使用相对路径(以./开头),或者是绝对路径(以/或C:之类的盘符开头;注意单个模块名默认指向node_modules文件)。
  • 模块名中的.js扩展名可以省略。
  • 可以加载和使用一个JSON文件。

exports(对象)

  • 当前模块的导出对象,用于导出模块公有方法和属性。
  • 别的模块通过require函数使用当前模块时得到的就是当前模块的exports对象。

module(对象)

  • 通过module对象可以访问到当前模块的一些相关信息,但最多的用途是替换当前模块的导出对象。
  • 如将模块导出对象改成一个函数
module.exports = function () {
console.log('Hello World!');
};

模块初始化

  • NodeJS使用CMD模块系统
  • 一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程中初始化模块的导出对象。之后,缓存起来的导出对象被重复利用。
var counter1 = require('./util/counter');
var counter2 = require('./util/counter'); //counter1和counter2是一样的

主模块

  • 通过命令行参数传递给NodeJS以启动程序的模块被称为主模块。
  • 主模块负责调度组成整个程序的其它模块完成工作

二进制模块

  • 一般使用JS编写模块,但NodeJS也支持使用C/C++编写二进制模块。
  • 编译好的二进制模块除了文件扩展名是.node外,和JS模块的使用方式相同。

模块路径解析规则

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

  • 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
  • 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)

index.js

  • 如果在导入文件的时候没有指明文件名,默认加载index.js文件
//node/person/index.js

var head = require('./head');
var body = require('./body'); exports.create = function(name) {
return {
name: name,
head: head.create,
body: body.create
}
}; //node/main.js var index = require('./lib'); 这样将person看成一个包
  • package.json

*如果cat文件夹中package.json文件这样定义,在之前的情况,就会优先加载main指定的文件;

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

命令行程序

  • 在任何目录下都能像是一个命令行程序运行程序

Linux系统下设置(以路径/home/user/bin/node-echo.js为例)

  • 在shell脚本中,可以通过#!注释来指定当前脚本使用的解析器。所以首先在node-echo.js文件顶部增加以下一行注释,表明当前脚本使用NodeJS解析。
#! /usr/bin/env node

NodeJS会忽略掉位于JS模块首行的#!注释

  • 然后,使用以下命令赋予node-echo.js文件执行权限。
$ chmod +x /home/user/bin/node-echo.js
  • 最后,在PATH环境变量中指定的某个目录下,例如在/usr/local/bin下边创建一个软链文件,文件名与希望使用的终端命令同名,命令如下:
$ sudo ln -s /home/user/bin/node-echo.js /usr/local/bin/node-echo

这样处理后,就可以在任何目录下使用node-echo命令。

Windows设置

  • 假设node-echo.js存放在C:\Users\user\bin目录,并且该目录已经添加到PATH环境变量里了。

*接下来需要在该目录下新建一个名为node-echo.cmd的文件,文件内容如下:

@node "C:\User\user\bin\node-echo.js" %*

工程目录

一个标准的工程目录

- /home/user/workspace/node-echo/   # 工程目录
- bin/ # 存放命令行相关代码
node-echo
+ doc/ # 存放文档
- lib/ # 存放API相关代码
echo.js
- node_modules/ # 存放三方包
+ argv/
+ tests/ # 存放测试用例
package.json # 元数据文件
README.md # 说明文件

NPM

同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的问题,常见的使用场景:

  • 允许用户从NPM服务器下载别人编写的三方包到本地使用: npmjs.org包名搜索

  • 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用: 方法与三方包类似

  • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用: 第一次使用NPM发布代码前需要注册一个账号。终端下运行npm adduser,之后按照提示做即可;

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发布代码。

版本号: 语义版本号分为X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下原则更新。

  • 如果只是修复bug,需要更新Z位。

  • 如果是新增了功能,但是向下兼容,需要更新Y位。

  • 如果有大变动,向下不兼容,需要更新X位。

在申明三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范围的版本号。

其他命令

  • npm help <command>可查看某条命令的详细帮助。

  • 在package.json所在目录下使用npm install . -g可先在本地安装当前命令行程序,可用于发布前的本地测试。

  • npm update <package>可以把当前目录下node_modules子目录里边的对应模块更新至最新版本。

  • 使用npm update <package> -g可以把全局安装的对应命令行程序更新至最新版。

  • 使用npm cache clear可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人。

  • 使用npm unpublish <package>@<version>可以撤销发布自己发布过的某个版本代码。

node.js整理 01代码的组织和部署的更多相关文章

  1. Node.js 教程 01 - 简介、安装及配置

    系列目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 Node.js 教程 0 ...

  2. 记录一次用宝塔部署微信小程序Node.js后端接口代码的详细过程

    一直忙着写毕设,上一次写博客还是元旦,大半年过去了.... 后面会不断分享各种新项目的源码与技术.欢迎关注一起学习哈! 记录一次部署微信小程序Node.js后端接口代码的详细过程,使用宝塔来部署. 我 ...

  3. Node.js调用C#代码

    在Node.js的项目中假如我们想去调用已经用C#写的dll库该怎么办呢?在这种情况下Edge.js是一个不错的选择,Edge.js是一款在GitHub上开源的技术,它允许Node.js和.NET c ...

  4. node.js初识01

    1.对于node.js的安装在这里就不做过多的介绍了,安装成功后,可以通过cmd 输入node -v查看node的版本号,如图所示 2.开始我们的hello world,通过cmd进入所属文件夹,输入 ...

  5. Node.js 笔记01

    一.Node.js 前言 1.node.js 之父 Ryan Dahl(瑞安达尔) ,技术好,颜值高! 数学系博士, 中途退学, 为了生活, 学习了Ruby On Rails接Web项目, 经过两年成 ...

  6. node.js 学习01

    PHP开发技术栈(LAMP) Linux  Apache  MySql  PHPnode.js 全栈开发技术栈(MEAN): MongoDB  Express  Angular  Node.js 现阶 ...

  7. 【从零开始学习Node.js】一.在CentOS 7中部署Node.js环境

    一.背景信息 Node.js是一个基于Chrome V8引擎的JavaScript运行环境,用来方便快速地搭建易于扩展的网络应用.Node.js使用了一个事件驱动.非阻塞式I/O的模型,使其轻量又高效 ...

  8. node.js整理 07例子

    需求 一个简单的静态文件合并服务器,该服务器需要支持类似以下格式的JS或CSS文件合并请求. http://assets.example.com/foo/??bar.js,baz.js 在以上URL中 ...

  9. node.js整理 05进程管理

    简介 NodeJS可以感知和控制自身进程的运行环境和状态,也可以创建子进程并与其协同工作,这使得NodeJS可以把多个程序组合在一起共同完成某项工作,并在其中充当胶水和调度器的作用 常用API Pro ...

随机推荐

  1. c/c++与Python的语法差异

    1.程序块语法方面: c/c++中用一对“{}”将多段语句括起来,表示一个程序块,并以右大括号表明程序块结束 ;i<n;i++) { cout<<a[i]; j+=; } Pytho ...

  2. simpleTree简单使用

    SimpleTree使用起来比较方便,它实现了最基本的树形菜单的功能,包括1个JS文件.1个CSS文件和5个图标文件. 使用时只要将相关文件复制到项目中,并在相应的页面引用它就行,例如: <!D ...

  3. 【资料】Boost的资料

    http://blog.csdn.net/pongba/article/details/1561110

  4. 关于 UICollectionViewCell 的一些陷阱

    如果直接使用 UICollectionViewCell 的自带属性 selected 来自定义一些样式,如: - (void)setSelected:(BOOL)selected { [super s ...

  5. Git+VirtalBaox+Vagrant创建Linux虚拟机

    文章内容来自Udacity课程:Linux Command Line Basics--Getting Started with the Shell Your own Linux box To lear ...

  6. Java代码实现excel数据导入到Oracle

    1.首先需要两个jar包jxl.jar,ojdbc.jar(注意版本,版本不合适会报版本错误)2.代码: Java代码   import java.io.File; import java.io.Fi ...

  7. java读写Properties文件

                Java   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ...

  8. gdo图形引擎中的旋转角

    横滚角(Roll) bank.roll  绕y轴 z轴正向为起点逆时针方向:往左为正,往右为负,水平时为0:有效范围:-180度-180度 注:下图是从飞机的尾部-->头部方向观察所得 俯仰角( ...

  9. sqlplus使用(二)

    详见SQL*Plus® User's Guide and Reference Release 11.2   5 Using Scripts in SQL*Plus   1.定义环境变量 _EDITOR ...

  10. android 入门-android Studio git配置

    以后在整理