文档章节

学习 Node.js 笔记(一)

刘军兴
 刘军兴
发布于 2015/11/26 13:30
字数 1794
阅读 92
收藏 0

学习一种语言并不难, 学习这种语言背后的生态环境可就不那么容易了.
虽然我用 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)

© 著作权归作者所有

共有 人打赏支持
刘军兴
粉丝 54
博文 184
码字总数 226359
作品 0
昌平
一点感悟:《Node.js学习笔记》star数突破1000+

写作背景 笔者前年开始撰写的《Node.js学习笔记》 github star 数突破了1000,算是个里程碑吧。 从第一次提交(2016.11.03)到现在,1年半过去了。突然有些感慨,想要写点东西,谈谈这期间的...

程序猿小卡_casper
06/06
0
0
效率至上的nodejs 手动实现服务器

这是一个连续的node学习笔记, 本文是第一章, 会持续更新, 持续完善 python好用,用久了就会把人的脾气养起来, nodejs不好用, 但效率很好, 也能彻底治好你的坏脾气 nodejs的回调是我用过的最蛋...

木子昭
08/20
0
0
细谈Node.js----我的笔记

学习心得 如何利用Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的 Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。N...

crossmix
2016/01/04
221
0
appium 安装教程链接整理

Appium 做Android 自动化测试环境搭建+示例代码运行 :http://blog.csdn.net/pajack/article/details/29390031 安装eclipse的maven插件:http://jingyan.baidu.com/article/60ccbceb01de4d64......

智能小松鼠
2014/11/26
0
2
nodejs实践--模块Request学习

官方文档 npm官网--request 文章来自:Request —— 让 Node.js http请求变得超简单 先前一直比较关注前端的东西,对后端了解较少。不过一直对Node.js比较感兴趣,去年12月还去参加了阿里的C...

spinachgit
08/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

IDEA 鼠标跳到下一行

敲代码时有时会出现这样的情况,鼠标在图中的位置,还需要手动将鼠标移动到这行的末尾然后再回车才能到新的一行。 用【Shift + Enter】,可以【IDEA新建一行,并且光标移到新行】...

karma123
7分钟前
2
0
在Kubernetes集群中部署ownCloud云盘系统

ownCloud ownCloud is a file sharing server that puts the control and security of your own data back into your hands. 参考 建立自己的共享云盘 - 使用ownCloud 远程访问家里机器的文件......

openthings
10分钟前
1
0
Python编写的以太坊虚拟机的新实现Py-EVM

Py-EVM是用Python编写的以太坊虚拟机的新实现。目前github上695个star,正在积极开发中,但正在通过以太坊/测试提供的测试套件快速推进。我们感谢有Vitalik和现有的PyEthereum代码,使得我们...

geek12345
11分钟前
1
0
(2)集成element-ui

(2)集成element-ui 1 安装element-ui依赖 cnpm install --save element-ui 2 按需引入 借助 babel-plugin-component,我们可以只引入需要的组件,以达到减小项目体积的目的。 首先,安装 ...

neumeng
16分钟前
2
0
linux下tree命令的用法解释

tree命令,主要功能是创建文件列表,将所有文件以树的形式列出来 linux下的tree就比较强大了,但一般系统并不自带这个命令,需要手动下载安装。 安装 : 1 yum -y install tree -a 显示所有文...

嘘嘘者
29分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部