文档章节

学习 Node.js 笔记(一)

刘军兴
 刘军兴
发布于 2015/11/26 13:30
字数 1794
阅读 83
收藏 0
点赞 0
评论 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
细谈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
Centos 7 下 GitBook 的安装与使用

文前说明 作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。 本文仅供学习交流使用,侵权必删。 不用...

羽杰
2017/09/21
0
0
moro:一个用于追踪工作时间的命令行生产力工具

保持对你的工作小时数的追踪将让你知晓在一个特定时间区间内你所完成的工作总量。在网络上有大量的基于 GUI 的生产力工具可以用来追踪工作小时数。但我却不能找到一个基于 CLI 的工具。今天我...

作者: Sk
05/07
0
0
【NodeJS】学习笔记和参考资料

NODE JS 笔记篇|>>---------------------------------------------------------------------------------------------------- 1、相关基础命令行操作 2、Node和npm在 Mac 中的默认安装目录 ......

呢喃的猫咪
2012/09/17
0
0
NodeJS系列~第三个小例子,NodeJs与Redis实现高并发的队列存储

众所周知 redis量个强大的缓存组件,可以部署在win32和linux环境之上,它有五大存储结构,其中有一种为列表list,它可以实现quene和stack的功能,即队列和堆栈的功能。 redis相关文章,可以看...

mcy247
2017/12/06
0
0
Node.js的学习资源、教程和工具

这篇文章编译整理自Stack Overflow的一个如何开始学习Node.js的Wiki帖,这份资源列表在SO上面浏览接近60万次,数千个收藏和顶。特意整理发布到这里,其中添加了部分中文参考资料。 学习指南和...

90后爱国
2015/07/21
0
0
怪异的JavaScript系列(二)

译者按: JavaScript有很多坑,经常一不小心就要写bug。 原文: What the f*ck JavaScript? 译者: Fundebug 为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学...

Fundebug
04/25
0
0
Xufun’s Node.js Primer

看了我的前研日志,从2012年04月开始接触Node.js,半年快过去了,今天总结一下,把自己的经历汇总,给需要学习的人提供一点参考。 Node.js是什么?不是Web服务之类,是叫“平台”,官网说明:...

蓄丰
2012/09/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java基础——异常

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 异常处理: 可以挖很多个陷阱,但是不要都是一样...

凯哥学堂
3分钟前
0
0
180723-Quick-Task 动态脚本支持框架之结构设计篇

Quick-Task 动态脚本支持框架之结构设计篇 相关博文: 180702-QuickTask动态脚本支持框架整体介绍篇 180719-Quick-Task 动态脚本支持框架之使用介绍篇 前面两篇博文,主要是整体介绍和如何使用...

小灰灰Blog
6分钟前
0
0
SBT 常用开发技巧

SBT 一直以来都是 Scala 开发者不可言说的痛,最主要的原因就是官方文档维护质量较差,没有经过系统的、循序渐进式的整理,导致初学者入门门槛较高。虽然也有其它构建工具可以选择(例如 Mill...

joymufeng
11分钟前
0
0
HBase in Practice - 性能、监控及问题解决

李钰(社区ID:Yu Li),阿里巴巴计算平台事业部高级技术专家,HBase开源社区PMC&committer。开源技术爱好者,主要关注分布式系统设计、大数据基础平台建设等领域。连续4年基于HBase/HDFS设计和...

中国HBase技术社区
11分钟前
1
0
ES18-JAVA API 批量操作

1.批量查询 Multi Get API public static void multiGet() {// 批量查询MultiGetResponse response = getClient().prepareMultiGet().add("my_person", "my_index", "1")// 查......

贾峰uk
16分钟前
0
0
SpringBoot2.0使用health

1,引入actuator <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency> 2,application.properties ......

暗中观察
23分钟前
0
0
阿里巴巴Java开发规约

###编程规约 命名风格 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束 【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。...

简心
28分钟前
0
0
如何用TypeScript来创建一个简单的Web应用

转载地址 如何用TypeScript来创建一个简单的Web应用 安装TypeScript 获取TypeScript工具的方式: 通过npm(Node.js包管理器) npm install -g typescript 构建你的第一个TypeScript文件 创建...

durban
32分钟前
0
0
分享好友,朋友圈自定义分享链接无效

这个问题是微信6.5.6版本以后,修改了分享规则:分享的连接必须在公众号后台设定的js安全域名内

LM_Mike
50分钟前
0
0
2018年7月23日课程

一、LVS-DR介绍 director分配请求到不同的real server。real server 处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。负载均衡器仅处理一半的连接,避免了...

人在艹木中
53分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部