Skip to content

Commit 43d1bab

Browse files
committed
修改node/npm
1 parent 68ebec7 commit 43d1bab

File tree

5 files changed

+141
-10
lines changed

5 files changed

+141
-10
lines changed

grammar/function.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,27 @@ f3.name // 'myName'
266266

267267
上面代码中,函数的name属性总是返回紧跟在function关键字之后的那个函数名。对于f2来说,返回空字符串,对于f3来说,返回函数表达式的名字(真正的函数名还是f3,myName这个名字只在函数体内部可用)。
268268

269+
## toString方法
270+
271+
函数的toString方法返回函数的源码。
272+
273+
```javascript
274+
275+
function f() {
276+
a();
277+
b();
278+
c();
279+
}
280+
281+
f.toString()
282+
// function f() {
283+
// a();
284+
// b();
285+
// c();
286+
// }
287+
288+
```
289+
269290
## 函数作用域
270291

271292
### 定义

nodejs/npm.md

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -381,54 +381,100 @@ browserify browser/main.js | uglifyjs -mc > static/bundle.js
381381

382382
一般来说,每个项目都会在项目目录内,安装所需的模块文件。也就是说,各个模块是局部安装。但是有时候,我们希望模块是一个符号链接,连到外部文件,这时候就需要用到npm link命令。
383383

384-
现在模块A(moduleA)的安装目录下运行npm link命令。
384+
为了理解npm link,请设想这样一个场景。你开发了一个模块myModule,目录为src/myModule,你自己的项目myProject要用到这个模块,项目目录为src/myProject。每一次,你更新myModule,就要用`npm publish`命令发布,然后切换到项目目录,使用`npm update`更新模块。这样显然很不方便,如果我们可以从项目目录建立一个符号链接,直接连到模块目录,就省去了中间步骤,项目可以直接使用最新版的模块。
385+
386+
先在模块目录(src/myModule)下运行npm link命令。
385387

386388
{% highlight bash %}
387389

388-
/path/to/moduleA $ npm link
390+
src/myModule$ npm link
389391

390392
{% endhighlight %}
391393

392-
上面的命令会在npm的安装目录内,生成一个符号链接文件。
394+
上面的命令会在npm的全局模块目录内(比如/usr/local/lib/node_modules/),生成一个符号链接文件,该文件的名字就是package.json文件中指定的文件名
393395

394396
{% highlight bash %}
395397

396-
/usr/local/share/npm/lib/node_modules/moduleA -> /path/to/moduleA
398+
/usr/local/lib/node_modules/myModule -> src/myModule
397399

398400
{% endhighlight %}
399401

400-
然后,转到你需要放置该模块的项目目录,再次运行npm link命令,并指定模块名。
402+
然后,切换到你需要放置该模块的项目目录,再次运行npm link命令,并指定模块名。
401403

402404
{% highlight bash %}
403405

404-
/path/to/my-project $ npm link moduleA
406+
src/myProject$ npm link myModule
405407

406408
{% endhighlight %}
407409

408410
上面命令等同于生成了本地模块的符号链接。
409411

410412
{% highlight bash %}
411413

412-
/path/to/my-project/node_modules/moduleA -> /usr/local/share/npm/lib/node_modules/moduleA
414+
src/myProject/node_modules/myModule -> /usr/local/lib/node_modules/myModule
413415

414416
{% endhighlight %}
415417

416418
然后,就可以在你的项目中,加载该模块了。
417419

418420
{% highlight javascript %}
419421

420-
require('moduleA')
422+
var myModule = require('myModule');
421423

422424
{% endhighlight %}
423425

426+
这样一来,myModule的任何变化,都可以直接在myProject中调用。但是,同时也出现了风险,任何在myProject目录中对myModule,都会反映到模块的源码中。
427+
428+
npm link命令有一个简写形式,显示连接模块的本地目录。
429+
430+
```javascript
431+
432+
src/myProject$ npm link ../myModule
433+
434+
```
435+
436+
上面的命令等同于下面几条命令。
437+
438+
```javascript
439+
440+
src/myProject$ cd ../myModule
441+
src/myModule$ npm link
442+
src/myModule$ cd ../myProject
443+
src/myProject$ npm link myModule
444+
445+
```
446+
424447
如果你的项目不再需要该模块,可以在项目目录内使用npm unlink命令,删除符号链接。
425448

426449
{% highlight bash %}
427450

428-
/path/to/my-project $ npm unlink moduleA
451+
src/myProject$ npm unlink myModule
429452

430453
{% endhighlight %}
431454

455+
一般来说,npm公共模块都安装在系统目录(比如/usr/local/lib/),普通用户没有写入权限,需要用到sudo命令。这不是很方便,我们可以在没有root的情况下,用好npm。
456+
457+
首先在主目录下新建配置文件.npmrc,然后在该文件中将prefix变量定义到主目录下面。
458+
459+
```bash
460+
prefix = /home/yourUsername/npm
461+
```
462+
463+
然后在主目录下新建npm子目录。
464+
465+
```bash
466+
$ mkdir ~/npm
467+
```
468+
469+
此后,全局安装的模块都会安装在这个子目录中,npm也会到`~/npm/bin`目录去寻找命令。因此,`npm link`就不再需要
470+
root权限了。
471+
472+
最后,将这个路径在.bash_profile文件(或.bashrc文件)中加入PATH变量。
473+
474+
```bash
475+
export PATH=~/npm/bin:$PATH
476+
```
477+
432478
## npm publish
433479

434480
在发布你的模块之前,需要先设定个人信息。
@@ -523,3 +569,4 @@ npm publish
523569

524570
- James Halliday, [task automation with npm run](http://substack.net/task_automation_with_npm_run): npm run命令(package.json文件的script属性)的用法
525571
- Keith Cirkel, [How to Use npm as a Build Tool](http://blog.keithcirkel.co.uk/how-to-use-npm-as-a-build-tool/)
572+
- justjs, [npm link: developing your own npm modules without tears](http://justjs.com/posts/npm-link-developing-your-own-npm-modules-without-tears)

nodejs/packagejson.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,3 +161,7 @@ scripts: {
161161
### engines
162162

163163
engines指明了该项目所需要的node.js版本。
164+
165+
### preferGlobal
166+
167+
preferGlobal的值是布尔值,表示当用户不将该模块安装为全局模块时(即不用--global参数),要不要显示警告,表示该模块的本意就是安装为全局模块。

nodejs/process.md

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ process对象提供一系列属性,用于返回系统信息。
2626

2727
下面是主要属性的介绍。
2828

29-
**(1)process.stdout**
29+
**(1)process.stdout,process.stdin**
3030

3131
process.stdout用来控制标准输出,也就是在命令行窗口向用户显示内容。它的write方法等同于console.log。
3232

@@ -38,6 +38,39 @@ exports.log = function() {
3838

3939
{% endhighlight %}
4040

41+
42+
下面代码表示将一个文件导向标准输出。
43+
44+
```javascript
45+
var fs = require('fs');
46+
47+
fs.createReadStream('wow.txt')
48+
.pipe(process.stdout)
49+
;
50+
```
51+
52+
由于process.stdout和process.stdin与其他进程的通信,都是流(stream)形式,所以必须通过pipe管道命令中介。
53+
54+
```javascript
55+
var fs = require('fs');
56+
var zlib = require('zlib');
57+
58+
fs.createReadStream('wow.txt')
59+
.pipe(zlib.createGzip())
60+
.pipe(process.stdout)
61+
;
62+
```
63+
64+
上面代码通过pipe方法,先将文件数据压缩,然后再导向标准输出。
65+
66+
process.stdin代表标准输入。
67+
68+
```javascript
69+
process.stdin.pipe(process.stdout)
70+
```
71+
72+
上面代码表示将标准输入导向标准输出。
73+
4174
**(2)process.argv**
4275

4376
process.argv返回命令行脚本的各个参数组成的数组。第一个成员是node可执行文件,第二个成员是脚本文件名,其余成员是脚本文件的参数。

nodejs/stream.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,29 @@ Stream方法在Node中被定义成了一个抽象接口,具有readable、writa
1616

1717
Node内部的很多IO处理都部署了Stream接口,比如HTTP连接、文件读写、标准输入输出等。
1818

19+
数据流通过pipe方法,可以方便地导向其他具有Stream接口的对象。
20+
21+
```javascript
22+
var fs = require('fs');
23+
var zlib = require('zlib');
24+
25+
fs.createReadStream('wow.txt')
26+
.pipe(zlib.createGzip())
27+
.pipe(process.stdout)
28+
;
29+
```
30+
31+
上面代码先打开文本文件wow.txt,然后压缩,再导向标准输出。
32+
33+
```javascript
34+
fs.createReadStream('wow.txt')
35+
.pipe(zlib.createGzip())
36+
.pipe(fs.createWriteStream('wow.gz'))
37+
;
38+
```
39+
40+
上面代码压缩文件wow.txt以后,又将其写回压缩文件。
41+
1942
## HTTP请求
2043

2144
data事件表示读取或写入了一块数据。
@@ -133,3 +156,6 @@ readStream.on('end', function () {
133156

134157
{% endhighlight %}
135158

159+
## 参考链接
160+
161+
- James Halliday, [cs294-101-streams-lecture](https://github.com/substack/cs294-101-streams-lecture)

0 commit comments

Comments
 (0)