学习 Node.js 笔记(一)

学习一种语言并不难, 学习这种语言背后的生态环境可就不那么容易了.
虽然我用 javascript 也不少时间了, 但实际关注的大多是(数学)算法, 较少关注 js 的其它部分,
而现在为了学习别的开源软件(如近期看的 seajs,kitymind 等) 都需要了解 nodejs 的相关知识,
因此不得不补一些课.

初步找了几个网页, 先记录一下, 准备学习的:

   七天学会 nodejs:
    https://nqdeng.github.io/7-days-nodejs/

   npm的 package.json 中文文档
   https://github.com/ericdum/mujiang.info/issues/6/

期间如果看到有好的学习网站, 也记录到这里(防止找不到了...)

== 什么是 NodeJS ==

NodeJS 是一个解析器, 提供 fs,http (类似于浏览器提供的 document) 内置对象.
NodeJS 的作者创造它的目的是为了实现高性能的 Web 服务器, 看重事件机制和异步 IO 模型.
JS 语言有良好的 DOM 事件支持, 以及*不带*自己的IO, 所以作者选择它实现自己的想法...

导致大批的前端工具如雨后春笋... (意思形成了新的生态环境, 而我们又得了解一大堆东西...)

NodeJS 生态圈正欣欣向荣... (新事物的高速成长阶段...)

安装略. 进入 node 命令交互模式, 可以写 hello world ...:
nodejs> console.log('Hello World!');

 

模块(重点)

编写大一点的程序时需要将代码模块化(重点). 一般分拆每一个文件就是一个模块, 文件路径就是模块名.
   (也许 module 的单位比文件应该大一些, 一个 module 可以有多个文件...)

NodeJS 使用 CMD 模块系统: http://wiki.commonjs.org/wiki/CommonJS

CommonJS: a group with a goal of building up the JavaScript ecosystem(果然是生态圈) for ...

有 require, exports, module 三个预先定义好的变量可供使用. (seajs 与此一致吧...)

==== require ====

例子: var foo = require('./foo');  用于在当前模块 加载和使用(in)别的模块.
传入一个模块名, 返回一个模块导出对象. 可以用相对路径或绝对路径, 后缀 js 可省略.
(前面所看的 seajs 或别的相似工具应该都是此规约...)
(还可以加载 json, 但 json 格式要求稍严格, 还不能写注释, 有些不好用, 怎么办呢?)

==== exports ====

exports 是当前模块的导出(out)对象, 用于导出模块公有方法和属性. 对应 require 是 in. 

如 exports.hello = function () { print('Hello World!'); }

==== module ====

可访问模块的一些相关信息. 也可替换 module.exports 对象.

 

以上的概念在 seajs 中我们见到了, 应该是学和兼容该规约, 合理猜测是更多类似工具也符合该规约.

 

模块初始化: 模块第一次被使用时(加载时)执行一次(应是仅一次). 之后, 导出对象被缓存以重复利用.

主模块: NodeJS 启动的 js 程序. 如 node main.js

二进制模块: NodeJS 也支持用 C/C++编写二进制模块, 文件扩展名是 .node . 但难以跨平台.

 

== 代码的组织和部署 ==

...良好开端要准备好代码的目录结构和部署方式, (如脚手架).

模块路径解析规则: require(name) 中可以用 1.相对路径(如 './abc'); 2.绝对路径(如 'C:/xxx')
   第3种: 'foo/bar' --> 此时应用路径解析规则.

特殊 node_modules 目录. (以前在多个工程中见到也使用该目录, 但确切不知道怎么回事...)
该目录用于存放模块. 会在 node_modules 目录中找模块(以及父目录的 node_modules 下).

 

包(package)

JS 模块的基本单位是 js 文件, 多个子模块组成的大模块称为包. (package 比 module 的单位要大一些)
为方便xx, (包中)子模块在同一目录里. ...需要一个入口模块, 入口模块导出作为包的导出.

(软件从底层到高层结构, 简单划分为:
    function -> class -> module(file) -> package(dir) -> application(process/machine) -> net
 其中 module/package 的成分可能交叉一些, 根据程序大小不同)

使用 package 时, (只)需要加载包的入口模块. 模块 index.js 作为缺省的 package 的入口模块.

 

 

== package.json 文件 ==

如果想自定义入口模块的文件名和存放位置, 可在包目录下包含一个 package.json 文件... 示例内容:

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

NodeJS 根据此 package.json (位于加载的模块路径下) 文件查找入口模块所在位置.

现学现用, 找到 seajs 下的 package.json:

{
  "name": "seajs",
  "main": "./lib/sea.js",
  // ...其它内容略...
}

命令行程序:

为了能在任何目录执行(我们编写的)程序, (linux下做法略,需要再查); Windows 下靠 .cmd 文件 (批处理...):

   @node "C:\xxx\yyy\zzz.js" %*

 

工程目录

(一般要)提供: 命令行模式; API 模式; 需要: 第三方包; 文档; 测试用例. ===> 所以:

- 工程根目录
   - bin/ 命令行相关代码 (可选)
   - doc/ 文档 (可选)
   - lib/ API 相关代码
   - node_modules/ 第三方包 (一般有)
   - tests/ 测试用例 (可选)
   package.json   元数据文件
   README.md      说明文件

由于有了 package.json (内部要有合适内容), 这个(工程)目录也可当做一个包使用.

(问题: 有没有好的 nodejs 开发 ide, or editor)

 

npm

NPM 是随同 nodejs 一起安装的包管理工具. npm 建立了一个 nodejs 生态圈. 使用场景有几种:

1. 下载第三方包

首先要知道有哪些包可用. 在 npmjs.org 可通过包名搜索. 看了一下, 该网站有 20+万的包, 估计还会巨量增长.
含著名的 grunt, express, bower, less 等包... 下载方法:

$ npm install xxx

下载的包放在(当前工程)目录下的 node_modules 目录中.

在 package.json 文件中如果有 "dependencies" 部分, 则可以用 npm install 批量安装.

(现查看了 kityminder 下的 package.json, 里面没有 dependencies, 而是
   devDependencies, 可能格式升级了...?)

2. 安装命令行程序

例子 npm install xxx -g

参数 -g 表示全局安装, 会自动创建 .cmd 文件(Windows 下).

3. 发布代码

使用  NPM 发布代码需要账号: npp adduser. (略)

package.json 中需要字段:
   name: 包名, 必须唯一(在 npm 服务器上)
   version: 当前版本号. 如 '1.0.0'
   dependencies: { ... }   第三方依赖, 需指定包名和版本.
   main: 入口模块位置.
   bin: ... 命令行程序名和主模块位置.

实际查看了一个 package.json 文件, 里面的字段其实更多...

 

版本号问题

(还是 markdown 写文档简单些, 可能又需要学习学习了...)

npm 使用语义版本号, 分为 X.Y.Z 三位, 表示 主版本号.次版本号.补丁版本号

版本号 X 变化指大变动, 不向下兼容; Y 变化指新增功能, 但向下兼容; Z 指修复了 bug.

这样 npm 可以指定依赖的版本范围. (参见 npm 官方文档)

 

灵机一点:

除了 npm install 命令, 还有 npm xxx 很多命令. 如 npm help!

npm update 可更新(依赖)模块到最新版本.

(试着在 seajs 工程目录下执行 npm install, 结果安装了 120+ 个 module, 真的需要这么多吗?
   虽然我硬盘挺大, 但是也不能乱装不用的东西吧... [震惊])

(END)

你可能感兴趣的:(学习 Node.js 笔记(一))