Skip to content

Instantly share code, notes, and snippets.

@able8
Last active November 2, 2018 10:41
Show Gist options
  • Save able8/83d745aad634aa32c3a7192b70c6585d to your computer and use it in GitHub Desktop.
Save able8/83d745aad634aa32c3a7192b70c6585d to your computer and use it in GitHub Desktop.
q
#!/bin/bash
BookUrl="http://cw.hubwiz.com/card/c/54ee8d2de564e519b8f8dad3/1/1/1/"
curl -s "${BookUrl}" | grep '" $' | awk -F '"' '{print "http://cw.hubwiz.com"$2}' > url.txt
MdFileName='js.md'
for url in $(cat url.txt)
do
echo $url
Html=$(echo $url | awk -F '/' '{print $6"-"$7"-"$8"-"$9}')".html"
#5359f6f6ec7452081a7873d8-1-1-1
#curl -s $url -o "${Html}"
# 输出目录1级标题
if [ "$(echo $url | awk -F / '{print $9}')" = "1" ]
then
Nu=$(echo $url | awk -F / '{print $8}')
grep '"list-group-item"><b>' ${Html} | awk -F '[><]' -v nu="$Nu" 'NR==nu{print "# "nu" "$5}' >> ${MdFileName}
fi
# 输出目录2级标题
Nu=$(echo $url | awk -F / '{print $8}')
Nu2=$(echo $url | awk -F / '{print $9}')
grep -B 4 "<article " ${Html} | awk -F '[><]' -v nu="$Nu" -v nu2="$Nu2" '{print "\n## "nu"."nu2" "$3}' | head -2 >> ${MdFileName}
cat ${Html} | sed -n '/<article/,$p' | sed -n '2,/article>/p' | sed '/article>/d' | LC_ALL=C sed 's/^[[:space:]]*//g' | \
sed -E 's/<h1 id[^>]*>/### /g;s/<\/h1>/∑/g;s/<h2 id[^>]*>/#### /g;s/<\/h2>/∑/g;s/<h3 id[^>]*>/##### /g;s/<\/h3>/∑/g;s/<h4 id[^>]*>/##### /g;s/<\/h4>/∑/g;s/<hr>/-----------------/g;s/<strong>/**/g;;s/<\/strong>/**/g;s/<em>/*/g;s/<\/em>/*/g;s/<p>//g;s/<pre><code>/```javascript∑/g;s/<\/code><\/pre>/```∑∑/g;' |\
sed "s/<div class='cw-exe'>/∑> /g" |\
sed 's/<div class="cw-exe">/∑> /g' |\
sed 's/^<\/div>$/∑/g' |\
sed "s/&#39;/'/g" |\
sed 's/&quot;/"/g' |\
sed 's/&lt;/</g;s/&gt;/>/g' |\
sed -E 's/<code>|<\/code>/`/g;s/<\/p>/∑/g' | tr '∑' '\n' >> ${MdFileName}
done

1 进入javascript世界

1.1 认识JavaScript

JavaScript是什么?

JavaScript是一种可以用来给网页增加交互性的编程语言。也常被称为“脚本语言”。 它是世界上最流行的编程语言。

学习JavaScript的好处
  • 1.所有主流浏览器都支持JavaScript
  • 2.大部分的网页都会用到JavaScript
  • 3.可以让网页呈现各种动态效果
  • 4.学习起来很容易,同时学习环境只要有文本编辑器就可以编写JavaScript代码
##### 本课程能学到什么?

本课程是入门课程,内容主要是基础的语法DOM的简单操作

1.2 如何插入js代码

js代码的位置

html中的js代码必须放在script标签里面。

js代码可以放在HTML页面中head和body标签部分中。

示例:
<!DOCTYPE html>
<html>
<head>
<title>first script</title>
</head>
<body>
<script>
document.write("hello world!");
</script>
</body>
</html>
示例讲解:
  • *<script>*这是script 开始标签,告诉浏览器后面的代码是js而不是html;
  • *document.write("Hello, world!");*这是是一个JavaScript语句:它获得文档窗口并在其中写入"Hello, world!"。一行的结束就被认定为语句的结束,通常在结尾加上一个分号";"来表示语句的结束。
  • *</script>*这结束JavaScript,并告诉浏览器后面的代码是html。
PS: 那些老旧的实例可能会在 script 标签中使用* type="text/javascript"*。现在已经不必这样做了。JavaScript 是所有现代浏览器以及 html5 中的默认脚本语言。

在右侧html代码框中第九行试试上述hello world的例子。

1.3 引入外部js

外部js的引用

有时候我们经常需要让多个html页面共享一个脚本,所以就把脚本保存到外部文件中。 外部JavaScript文件的文件扩展名是 .js。

如需使用外部文件,请在 <script>标签的 "src" 属性中设置该 .js 文件:

示例:
<!DOCTYPE html>
<html>
<head>
<!-- 引入了外部的一个myScript.js的文件 -->
<script src="myScript.js"></script>
</head>
<body>
</body>
</html>

文件路径:./example/hello.js,代码如下:

document.write("我是一个外部的JavaScript文件");

提示:外部JavaScript文件中不用<script>标签

在右侧html代码框中第六行中引入上述中hello.js文件。

1.4 变量

什么是变量?

变量是用于存储信息的容器。

变量的命名规则
  • 变量必须以字母开头;
  • 变量也能以$和_符号开头(不过我们不推荐这么做);
  • 变量名称对大小写敏感(a和A是不同的变量)。
##### 变量的声明

语法:var 变量名

示例:
var x = 2015; //声明变量的同时初始化变量
var MyName = "hubwiz"; //在为变量赋文本值时,为该值加引号

在右侧html代码框中的script标签中声明 x 和 y 变量 并分别赋值(任意赋值),然后利用document.write(x)和document.write(y)进行输出。

1.5 语句

语句

语句以一个分号结尾;如果省略分号,则由解析器确定语句的结尾。

如下示例:

var sum = a + b // 即使没有分号也是有效的语句——不推荐
var dif = a - b; // 有效的语句——推荐

然语句结尾的分号不是必需的,但我们建议任何时候都不要省略它。另外,加上分号也会在某些情况下增进代码的性能,因为这样解析器就不必再花时间推测应该在哪里插入分号了。

1.6 数据类型

数据类型

在JavaScript中,一段信息就是一个值(value)。值有不同的类型,大家最熟悉的类型是数字。字符串(string)值是包围在引号中的一个或多个单词。

类型 描述 示例
数字 任何数字值。数字可以带小数点,也可以不带 68.57
字符串 引号中的字符。您可以使用单引号或双引号 "hello, world"
布尔值(Boolean) true或false true
Undefined 和 Null Undefined 这个值表示变量不含有值。可以通过将变量的值设置为 null 来清空变量。
对象 与对象相关联的任何值
函数 函数返回的值

PS:数据类型中我们将在《JavaScript深入》课程更加详细的讲解

动态类型

JavaScript 拥有动态类型。这意味着相同的变量可用作不同的类型。

示例:
var a; //a为undefined
var a = 6; //a 为数字
var a = "Jason"; // a 为字符串

声明一个数字类型和字符串类型的,并利用document.write()进行输出。

2 开始互动

2.1 代码中的注释

注释的作用

注释用于提高代码的可读性。由于JavaScript不会执行注释,也可用于阻止代码的执行(多用于调试)。注释分为:单行注释和多行注释

单行注释

单行注释是在注释内容前加符号 "//" 。

如下示例:
document.write("my name is huizhiwang"); //我是注释,该语句用于输出
多行注释
如下示例:
/*
这里是多行注释
下面的语句用于输出
*/
document.write("多行注释");

在右侧html代码框第六行单行注释掉,把七、八、九行进行多行注释。

2.2 关于函数(function)

什么是函数?

函数是一组执行某一任务的JavaScript 语句,可被脚本的其他部分调用。这时我们就可以把完成特定功能的代码块放到一个函数里,直接调用这个函数,就省重复输入大量代码的麻烦。

基本语法:
function functionName(){
代码块
}
functionName();
说明:
  • *function* 定义函数的关键字
  • *第一个functionName* 是自己给函数取的名字
  • *代码块* 是完成某一任务的代码
  • *第二个functionName* 函数调用的一种
PS:还有其他定义函数的方法,我们将在JavaScript进阶中讲解
示例:
function add(){
var x = 3; //定义变量x
var y = 6; //定义变量y
document.write(x + y);  //document.write 输出 x 加 y 之后的值
}
add();

在JavaScript代码框中编写一个函数名是doc,功能是输出文本是*"你是一个好人"*的警告框。最后调用这个函数。

2.3 发出警报(alert)

发出警报

JavaScript的主要用途之一是向用户提供反馈的信息。比如创建一个弹出的警告窗口,提供给用户必须要了解的重要信息。这个警告窗口是使用alert实现的。

语法:alert(字符串或变量);

示例:
var myName = "者行孙"
alert("hello!");
alert(myName);

PS: 弹出警告的警告窗口有一个确定按钮,点击确定会继续执行后面的代码。

在script标签中定义一个变量名为myName赋值,并使用alert弹出变量myName的内容。

2.4 确认选择(confirm)

确认选择

除了向用户提供信息,我们还希望从用户那里获得信息。这里就用到了confirm 消息对话框。

语法:confirm(str);

参数说明:

str: 在消息对话框中要显示的文本,返回的是布尔值。当点击“确定”按钮时,会返回true,点击“取消”按钮时,返回的是false。

示例:
if(confirm("你有房有车有存款吗?")==true){
document.write("求包养");
}else{
document.write("努力吧,少年");
}

询问用户“你喜欢学习JavaScript吗?”,当为true时返回“让我们一起共同进步” 当为false时返回“你可能需要进一步了解JavaScript”。

2.5 提示(prompt)

提示

有时候,不仅希望用户回答Yes/No。而是希望得到更特定的响应。这中情况我们可以利用prompt。

语法:prompt(str1, str2);

参数说明:

str1:要显示在消息对话框中的文本,不能修改

str2:文本框中的内容,可以修改

点击确定按钮,文本框中的内容将作为函数返回值,点击取消按钮将返回null。

示例:
var myName = prompt("输入您的名字");
if(myName != null &amp;&amp; myName != ''){
document.write("welcome to " + myName);
}else{
document.write("welcome to my friend.");
}

练习一下上面中的示例,不要复制哦。

2.6 打开新页面

打开新页面

在html页面中,有时我们需要跳转到新的页面中。这是时候就用到了open()。

语法:window.open(URL, 窗口名称);

参数说明:

URL:可选,打开窗口的网址或路径。如果省略了这个参数,或者它的值是空字符串,那么新窗口就不会显示任何文档。

窗口名称:可选,该字符串是一个由逗号分隔的特征列表,声明了被打开窗口的名称。可以是"_top"、"_blank"、"_selft"、"_parent"等。

  • _*blank* 在新窗口显示目标网页
  • _*selft* 在当前窗口显示目标网页
  • _*parent* 框架网页中当前整个窗口位置显示目标网页
  • _*top* 框架网页中在上部窗口中显示目标网页
##### 示例:
function open_win() {
window.open("http://www.baidu.com","_blank");
}
open_win();

示例功能:跳转到"<a href="http://www.baidu.com",以新的窗口打开。">http://www.baidu.com",以新的窗口打开。

以新的窗口打开"<a href="http://www.hubwiz.com"首页。">http://www.hubwiz.com"首页。

3 流程控制

3.1 if..else.. 语句

if..else.. 语句

用于基于不同的条件来执行不同的动作。

有三种语句:
if语句

只有当指定条件为true时,该语句才会执行代码。

语法:
if(条件){
只有条件为true才会执行的代码
}
if...else 语句

当条件为true时执行if里面的代码,在条件为false时执行else里面的代码

语法:
if(条件){
条件为true时执行的代码
}else{
当条件不为 true 时执行的代码
}
If...else if...else 语句

使用 if....else if...else 语句来选择多个代码块之一来执行。

语法:
if (条件 1) {
当条件 1  true 时执行的代码
} else if (条件 2) {
当条件 2  true 时执行的代码
} else {
当条件 1  条件 2 都不为 true 时执行的代码
}

在javascript代码框中,定义一个分数的变量,当分数大于90 输出优秀,大于60小于90输出及格,小于60输出不及格

3.2 switch 语句

switch 语句

switch 语句用于基于不同的条件来执行不同的动作。

语法:
switch(n) {
case 1:
执行代码块 1
break;
case 2:
执行代码块 2
break;
default:
n  case 1  case 2 不同时执行的代码
}

语法解释:首先设置表达式 n(通常是一个变量)。随后表达式的值会与结构中的每个 case 的值做比较。如果存在匹配,则与该 case 关联的代码块会被执行。请使用 break 来阻止代码自动地向下一个 case 运行。

default 关键词

default 关键词来规定匹配不存在时做的事情

3.3 for 循环

for 循环

如果您希望一遍又一遍地运行相同的代码,并且每次的值都不同,那么这时使用循环会很方便的完成您的需求,下面讲解for循环的用法和示例。

语法:
for (语句 1; 语句 2; 语句 3)  {
被执行的代码块
}

参数解释:

  • *语句 1* 在循环(代码块)开始前执行
  • *语句 2* 定义运行循环(代码块)的条件
  • *语句 3* 在循环(代码块)已被执行之后执行
##### 示例:
for(var i = 0; i < 5; i++){
document.write("我是第" + i + "循环");
}

试试上述中的示例

3.4 while 循环

while 循环

只要指定条件为 true,循环就可以一直执行代码。

语法:
while (条件) {
需要执行的代码
}
示例:
var i = 0
while (i<5)  {
document.write("i的值" + i + "
");
i++;
}
do/while 循环

do/while 循环是 while 循环的变体。该循环会执行一次代码块,在检查条件是否为真之前,然后如果条件为真的话,就会重复这个循环。

语法:
do {
需要执行的代码
}
while (条件);
示例:
var i = 0;
do  {
document.write("i的值" + i + "
");
i++;
}while(i < 5);

试试上述中的示例

3.5 break 和 continue 语句

break 和 continue 语句

break 语句用于跳出循环。continue 用于跳过循环中的一个迭代。

break 语句

我们已经在switch()语句的讲解中见到过,它用于跳出switch()语句。break 语句可用于跳出循环。break 语句跳出循环后,会继续执行该循环之后的代码(如果有的话):

示例:
for (var i=0;i<10;i++) {
if (i==3) {
break;
}
document.write("i等于:" + i + "
");
}
continue 语句

continue 语句中断循环中的迭代,如果出现了指定的条件,然后继续循环中的下一个迭代。

示例:
for (var i=0;i<10;i++) {
if (i==3) {
continue; //跳过了值 3
}
document.write("i等于:" + i + "
");
}

上述中的两个示例,在右边代码框中复现。

3.6 throw、try 和 catch(错误处理)

try...catch...语句

当错误发生时,当事情出问题时,JavaScript 引擎通常会停止,并生成一个错误消息。

try 语句允许我们定义在执行时进行错误测试的代码块。

catch 语句允许我们定义当 try 代码块发生错误时,所执行的代码块。

JavaScript 语句 try 和 catch 是成对出现的。

语法:
try {
//在这里运行代码
}catch(err) {
//在这里处理错误
}
示例:
try {
allert("Welcome guest!");\\这里是故意把alert单词写错
}catch(err) {
txt="本页有一个错误。\n\n";
txt+="错误描述:" + err.message + "\n\n";
txt+="点击确定继续。\n\n";
alert(txt);
}
throw 语句

throw 语句允许我们创建自定义错误。

正确的技术术语是:创建或抛出异常(exception)。

如果把 throw 与 try 和 catch 一起使用,那么您能够控制程序流,并生成自定义的错误消息。

语法:throw exception

参数:exception 可以是 JavaScript 字符串、数字、逻辑值或对象。

示例:
function myFunc(){
try{
//这是是获取id为test的输入框中的值,详细用处会在DOM操作中讲解
var test = document.getElementById("test").value;
if (x == ""){
throw "值为空";
}
if (x > 5){
throw "值小了";
}
if (x < 10){
throw "值大了";
}
}
catch (err){
alert("错误:" + err + "。");
}
}

仿照上面中的示例,功能是当输入的值小于60的时候抛出异常信息。

4 DOM操作

4.1 DOM简介

什么是DOM?

文档对象模型(Document Object Model简称DOM)定义访问和处理HTML文档的标准方法。 通过 DOM,可访问 HTML 文档的所有元素。

当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。 HTML DOM 模型被构造为对象的树。

代码段:
<!DOCTYPE html>
<html>
<head>
<meta content="text/html" charset="utf-8" />
<title>文档标题</title>
</head>
<body>

<h1>我的标题<h1>
<a href="http://www.hubwiz.com">我的链接</a>
</body>
</html>
将HTML代码分解为DOM树,如下图:

HTML文档可以说由节点构成的集合,三种常见的DOM节点:

    1. 元素节点:上图中*、、*等都是元素节点,即标签。
    1. 文本节点:向用户展示的内容,如*<title>...</title>*中的*“文档标题”*文本。
    1. 属性节点:元素属性,如**标签的链接属性 *href* 。

4.2 查找HTML元素

查找HTML元素

我们经常会遇到通过JavaScript来操作HTML元素要达到这个目标,我们必须首先找到该元素。

在这里我们将讲解两种方法来完成这件事情:

  • 1.通过id 查找HTML元素
  • 2.通过标签名查找HTML元素
##### 通过 id 查找 HTML 元素

在 DOM 中查找 HTML 元素的最简单的方法,是通过使用元素的 id。

如下:
//查找到id="email"的元素
var i = document.getElementById("email");

如果找到该元素,则该方法将以对象(在 x 中)的形式返回该元素。如果未找到该元素,则 x 将包含 null。

通过标签名查找 HTML 元素
如下:
//查找到标签为a的元素
var y=x.getElementsByTagName("a");
示例:

示例描述:

4.3 改变 HTML 元素的内容

改变 HTML

改变 HTML 内容

修改 HTML 内容的最简单的方法时使用* innerHTML *属性。

语法:document.getElementById(id).innerHTML=new HTML
示例1:
<html>
<body>

<p id="p1">Hello World!


<script>
document.getElementById("p1").innerHTML="New text!";
</script>
</body>
</html>
改变 HTML 属性
语法:
document.getElementById(id).attribute=new value
示例2:
<!DOCTYPE html>
<html>
<head></head>
<body>
<input id="changes" type="text" value="改变标签的属性" />
<script>
//把input的属性type值改变为button
document.getElementById("changes").type="button";
</script>
</body>
</html>

在右边代码框中试试上述中的示例。

4.4 改变 CSS

改变 HTML 样式

语法:document.getElementById(id).style.property=new style

property参数列表

属性 描述
background 在一行中设置所有的背景属性
border 在一行设置四个边框的所有属性
clear 设置在元素的哪边不允许其他的浮动元素
color 设置文本的颜色
font 在一行设置所有的字体属性
fontSize 设置元素的字体大小。
示例:
我叫王大锤!

<script>
//改变id="p1"的p元素的文本颜色。
document.getElementById("p2").style.color="red";
</script>

试试上述中的示例

1 Node.js 快速入门

1.1 第一个示例程序 hello world

快速入门

欢迎学习node,node使用javascript作为开发语言。没错,就是通常我们在前端页面里使用的javascript!下面我们一起来编写经典的hello world。

请在编辑器中输入以下内容,点击提交。 console.log('hello world');

1.2 回调函数应用示例

回调函数

由于node是一个异步事件驱动的平台,所以在代码中我们经常需要使用回调函数。下面是回调函数应用的经典示例:

setTimeout(function(){
console.log('callback is called');
},2000);

我们传给setTimeout函数传入了一个匿名函数和一个调用时间2000(毫秒),运行程序后等待2秒,可以看到输出了"callback is called"。

如果你要为setTimeout编写一个回调函数,1秒后调用输出"hello world",该怎么写呢,试一试?

1.3 标准的回调函数中参数err、data的含义

标准回调函数

node.js中回调函数格式是约定俗成的,它有两个参数,第一个参数为err,第二个参数为data,顾名思义,err是错误信息,data则是返回的数据,示例如下:

function(err,data){

}

为了养成良好的编码习惯,在以后的课程示例或练习中,回调函数格式都将采用这样的格式。

试一试,自己来编写一个回调函数吧!

1.4 通过require函数获取模块

获取模块

为了支持快速开发,node平台上提供了大量的模块,封装了各自不同的功能,那么我们将如何调获取想要的模块呢,下来我们就来介绍。 在node中,我们可以使用require函数,具体语法如下:

require("模块");

怎么样,是不是很简单很方便,通过require函数我们就可以获取相应模块进而使用它的任意功能了。

1.5 如何操作使用模块如OS模块

使用模块

os模块可提供操作系统的一些基本信息,它的一些常用方法如下:

var os = require("os");

var result = os.platform(); //查看操作系统平台
//os.release(); 查看操作系统版本
//os.type();  查看操作系统名称
//os.arch();  查看操作系统CPU架构

console.log(result);

看了上面的例子,试一试用console.log输出服务器操作系统的版本号。

1.6 本节教程小结

课程小结

本节介绍了node.js一些最基本的用法,为以后课程的打下基础。

另外,推荐一些api资料,以供学习时参考。

http://nodejs.cn/api http://nodeapi.ucdok.com/#/api/

2 Node.js 进程管理

2.1 进程管理中全局内置对象process

简介

process是一个全局内置对象,可以在代码中的任何位置访问此对象,这个对象代表我们的node.js代码宿主的操作系统进程对象。

使用process对象可以截获进程的异常、退出等事件,也可以获取进程的当前目录、环境变量、内存占用等信息,还可以执行进程退出、工作目录切换等操作。

下面我们一起来学习一下process对象的一些常用方法。

2.2 查看当前目录cwd函数用法

cwd函数的基本用法

当我们想要查看应用程序当前目录时,可以使用cwd函数,使用语法如下:

process.cwd();

获取程序目录的方法就是这样简单,继续下一课时吧!。

2.3 改变应用程序目录chdir函数用法

chdir函数的基本用法

如果需要改变应用程序目录,就要使用chdir函数了,它的用法如下:

process.chdir("目录");

改变应用程序目录的方法就是这样简单,继续下一课时吧!

2.4 标准输出流stdout函数用法

stdout的基本用法

stdout是标准输出流,它是干什么的呢?请下看下面的示例:

console.log = function(d){
process.stdout.write(d+'\n');
}

没错,它的作用就是将内容打印到输出设备上,console.log就是封装了它。

试一试,用stdout输出"hello world"。

2.5 标准错误流stderr函数用法

stderr的基本用法

stderr是标准错误流,和stdout的作用差不多,不同的是它是用来打印错误信息的,我们可以通过它来捕获错误信息,基本使用方法如下:

process.stderr.write(输入内容);

试一试,用stderr输出字符串"test"。

2.6 进程的输入流stdin函数用法

stdin的基本用法

stdin是进程的输入流,我们可以通过注册事件的方式来获取输入的内容,如下:

process.stdin.on('readable', function() {
var chunk = process.stdin.read();
if (chunk !== null) {
process.stdout.write('data: ' + chunk);
}
});

示例中的chunk就是输入流中的内容。

2.7 退出程序或杀死进程exit函数用法

exit函数的基本用法

如果你需要在程序内杀死进程,退出程序,可以使用exit函数,示例如下:

process.exit(code);

参数code为退出后返回的代码,如果省略则默认返回0;

2.8 使用process.on()监听进程事件

监听进程事件

使用**process.on()**方法可以监听进程事件。

exit事件

当进程要退出之前,会触发exit事件。通过监听exit事件,我们可就以在进程退出前进行一些清理工作:

//参数code表示退出码
process.on("exit",function(code){
//进行一些清理工作
console.log("I am tired...")
});
var tick = Date.now();
console.log(tick);

uncaughtException事件

如果进程发生了未捕捉的异常,会触发uncaughtException事件。通过监听这个事件,你可以 让进程优雅的退出:

//参数err表示发生的异常
process.on("uncaughtException",function(err){
console.log(err);
});
//故意抛出一个异常
throw new Error("我故意的...");

2.9 进程管理设置编码解决中文显示乱码

设置编码

在我们的输入输出的内容中有中文的时候,可能会乱码的问题,这是因为编码不同造成的,所以在这种情况下需要为流设置编码,如下示例:

process.stdin.setEncoding(编码);

process.stdout.setEncoding(编码);

process.stderr.setEncoding(编码);

试一试,设置stdout编码格式为"utf8"

2.10 本节教程小结

课程小结

process的常用方法就讲到这里了,如果你想了解更多可以参考以下地址:

http://nodejs.cn/api/process http://nodeapi.ucdok.com/#/api/process.html

3 Node.js 文件I/O

3.1 文件I/O fs模块简介

文件I/O fs模块的基本用法

开发中我们经常会有文件I/O的需求,node.js中提供一个名为fs的模块来支持I/O操作,fs模块的文件I/O是对标准POSIX函数的简单封装。

3.2 writeFile函数 写入文件

writeFile函数的基本用法

文件I/O,写入是必修课之一。fs模块提供writeFile函数,可以异步的将数据写入一个文件, 如果文件已经存在则会被替换。用法如下:

例:fs.writeFile(filename, data, callback)

var fs= require("fs");

fs.writeFile('test.txt', 'Hello Node', function (err) {
if (err) throw err;
console.log('Saved successfully'); //文件被保存
});

数据参数可以是string或者是Buffer,编码格式参数可选,默认为"utf8",回调函数只有一个参数err。

3.3 appendFile函数 追加写入

appendFile函数的基本用法

writeFile函数虽然可以写入文件,但是如果文件已经存在,我们只是想添加一部分内容,它就不能满足我们的需求了,很幸运,fs模块中还有appendFile函数,它可以将新的内容追加到已有的文件中,如果文件不存在,则会创建一个新的文件。使用方法如下:

例:fs.appendFile(文件名,数据,编码,回调函数(err));

var fs= require("fs");

fs.appendFile('test.txt', 'data to append', function (err) {
if (err) throw err;

//数据被添加到文件的尾部
console.log('The "data to append" was appended to file!'); 
});

编码格式默认为"utf8",

3.4 exists函数 文件是否存在

exists函数的基本用法

如何检查一个文件是否存在呢?我想exists函数可以帮助你,用法如下:

例:fs.exists(文件,回调函数(exists));

exists的回调函数只有一个参数,类型为布尔型,通过它来表示文件是否存在。

var fs= require("fs");

fs.exists('/etc/passwd', function (exists) {
console.log(exists ? "存在" : "不存在!");
});

3.5 rename函数 修改文件名称

rename函数的基本用法

修改文件名称是我们经常会遇见的事情,rename函数提供修改名称服务:

var fs= require("fs");

fs.rename(旧文件,新文件,回调函数(err){
if (err) throw err;
console.log('Successful modification,');
});

3.6 rename函数 移动文件

rename函数的基本用法

移动文件也是我们经常会遇见的,可是fs没有专门移动文件的函数,但是我们可以通过rename函数来达到移动文件的目的,示例如下。

var fs = require('fs');

fs.rename(oldPath,newPath,function (err) {
if (err) throw err;
console.log('renamed complete');
});

3.7 readFile函数 读取文件

readFile函数的基本用法

读取文件是最常用到的功能之一,使用fs模块读取文件语法如下:

例:fs.readFile(文件,编码,回调函数);

var fs = require('fs');

fs.readFile(文件名, function (err, data) {
if (err) throw err;
console.log(data);
});

回调函数里面的data,就是读取的文件内容。

3.8 unlink函数 删除文件

unlink函数的基本用法

面对一堆垃圾的文件总是有想删除的冲动,我有强迫症?你才有呢。

好在有unlink函数,终于得救了,示例如下:

例:fs.unlink(文件,回调函数(err));

var fs = require('fs');

fs.unlink(文件, function(err) {
if (err) throw err;
console.log('successfully deleted');
});

3.9 mkdir函数 创建文件目录

mkdir函数的基本用法

除了针对文件的操作,目录的创建、删除也经常遇到的,下面我们来看看node.js中如何创建目录:

fs.mkdir(路径,权限,回调函数(err));

参数

  1. 路径:新创建的目录。
  2. 权限:可选参数,只在linux下有效,表示目录的权限,默认为0777,表示文件所有者、文件所有者所在的组的*用户、*所有用户,都有权限进行读、写、执行的操作。
  3. 回调函数:当发生错误时,错误信息会传递给回调函数的err参数。

3.10 rmdir函数 删除文件目录

rmdir函数的基本用法

删除目录也是必不可少的功能,rmdir函数可以删除指定的目录:

例:fs.rmdir(路径,回调函数(err));

var fs = require('fs');

fs.rmdir(path, function(err) {
if (err) throw err;
console.log('ok');
});

3.11 readdir函数 读取文件目录

readdir函数的基本用法

如果要读取目录下所有的文件应该怎么办呢?readdir函数可以读取到指定目录下所有的文件,示例如下:

var fs = require('fs');

fs.readdir(目录,回调函数(err,files));

回调函数 (callback) 接受两个参数 (err, files) 其中 files 是一个存储目录中所包含的文件名称的数组,数组中不包括 '.' 和 '..'。

3.12 课程小结

课程小结

文件I/O是最基本的操作,应该熟悉掌握。

fs模块不但提供异步的文件操作,还提供相应的同步操作方法,需要指出的是,nodejs采用异步I/O正是为了避免I/O时的等待时间,提高CPU的利用率,所以在选择使用异步或同步方法的时候需要权衡取舍。

本节课程讲解了fs模块常用的一些功能,当然它还有更多强大的功能,如果你想了解更多,可以参考以下资料:

4 Node.js url处理

4.1 url模块处理简介

url处理 url模块的基本用法

node.js为互联网而生,和url打交道是无法避免的了,url模块提供一些基础的url处理。

4.2 使用parse函数解析url

parse函数的基础用法

parse函数的作用是解析url,返回一个json格式的数组,请看如下示例:

var url = require('url');
url.parse('http://www.baidu.com');
运行结果:
{ protocol: 'http:',
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: null,
query: null,
pathname: 'www.baidu.com',
path: 'www.baidu.com',
href: 'http://www.baidu.com' }

试一试传入一个url,看看返回结果是什么?

4.3 parse函数之条件解析

parse函数 —— 条件解析

parse函数的第二个参数是布尔类型,当参数为true时,会将查询条件也解析成json格式的对象。

var url = require('url');
url.parse('http://www.baidu.com?page=1',true);
运行结果:
{ protocol: 'http:',
slashes: true,
auth: null,
host: 'www.baidu.com',
port: null,
hostname: 'www.baidu.com',
hash: null,
search: '?page=1',
query: { page: '1' },
pathname: '/',
path: '/?page=1',
href: 'http://www.baidu.com/?page=1' }

试一试,当参数分别为true和false时,返回数据中的query字段的内容有什么不同。

4.4 parse函数之解析主机

parse函数 —— 解析主机

parse函数的第三个参数也是布尔类型的,当参数为true,解析时会将url的"//"和第一个"/"之间的部分解析为主机名,示例如下:

var url = require('url');
url.parse('http://www.baidu.com/news',false,true);
运行结果:
{ protocol: 'http:',
slashes: true,
auth: null,
host: 'www.baidu.com',
port: null,
hostname: 'www.baidu.com',
hash: null,
search: null,
query: null,
pathname: '/news',
path: '/news',
href: 'http://www.baidu.com/news' }

较之前面的示例,host的内容不再是null了。

动手试一试,看看对比返回内容的不同。

4.5 format函数url地址格式化

format函数的基础用法

format函数的作用与parse相反,它的参数是一个JSON对象,返回一个组装好的url地址,请看如下示例:

var url = require('url');
url.format({
protocol: 'http:',
hostname:'www.baidu.com',
port:'80',
pathname :'/news',
query:{page:1}
});
运行结果:
http://www.baidu.com/news?page=1

参数JSON对象的字段跟parse函数解析后返回的JSON字段一一对应。

试一试传入一个对象,看看返回url是什么。

4.6 resolve函数url路径切换

resolve函数的基础用法

resolve函数的参数是两个路径,第一个路径是开始的路径或者说当前路径,第二个则是想要去往的路径,返回值是一个组装好的url,示例如下:

var url = require('url');

url.resolve('http://example.com/', '/one')  // 'http://example.com/one'
url.resolve('http://example.com/one', '/two') // 'http://example.com/two'

动动手,试一试resolve函数。

4.7 课程小结

课程小结

本节课程讲解了url模块常用的一些功能,如果你想了解更多,可以参考以下资料:

http://nodejs.cn/api/url

5 Node.js path优化

5.1 path模块简介

path优化 path模块的基本用法

本模块包含一套用于处理和转换文件路径的工具集,用于处理目录的对象,提高用户开发效率,让我们一起来快速的认识path对象的一些常用方法吧!

5.2 path模块normalize函数格式化路径

normalize函数的基本用法

normalize函数将不符合规范的路径经过格式化转换为标准路径,解析路径中的.与..外,还能去掉多余的斜杠。

如下示例:

var path = require('path');  
var data = path.normalize('/path///normalize/hi/..');
console.log(data);
运行结果:
'/path/normalize/'

看了上面的示例,是不是感觉很So easy,赶快寻个路径试试效果吧(按步操作哟)!

5.3 path模块join函数组合路径

join函数的基本用法

join函数将传入的多个路径拼接为标准路径并将其格式化,返回规范后的路径,避免手工拼接路径字符串的繁琐. 如下示例:

var path = require('path');
var data = path.join('///you', '/are', '//beautiful');
console.log(data);
运行结果:
'/you/are/beautiful'

看了上面的示例,是不是感觉和上一课时很相似呢,赶快试试吧!

5.4 dirname函数返回路径中目录名

dirname函数的基本用法

dirname函数用来返回路径中的目录名. 如下示例:

var path = require('path');
var data = path.dirname('/foo/strong/cool/nice'); 
console.log(data);
运行结果:
'/foo/strong/cool'

看了上面的说明和示例,感觉如何,动手来试一下吧!

5.5 basename函数返回路径中最后部分

basename函数的基本用法

basename函数可返回路径中的最后一部分,并且可以对其进行条件排除. 如下示例:

例1:path.basename('路径字符串');

例2:path.basename('路径字符串', '[ext]')<排除[ext]后缀字符串>;

var path = require('path');    
var data1 = path.basename('/foo/strong/basename/index.html');
var data2 = path.basename('/foo/strong/basename/index.html','.html');
console.log(data1 + ' "and" ' + data2);
运行结果:
'index.html "and" index'

看完了两个例子的介绍和区别,赶快动手亲自感受一下吧!

5.6 extname函数返回路径中文件扩展名

extname函数的基本用法

extname函数返回路径中文件的扩展名(以最后一个'.'开始,返回'.'以及'.'以后的所有字符串,如没有'.',则返回空字符串). 如下示例:

var path = require('path');
var data = path.extname('index.html');
console.log(data);
运行结果:
'.html'

经过前面几节课时的学习,相信你已经对path的几个方法充分了解掌握了,趁热打铁,试试extname函数吧!

5.7 课程小结

课程小结

很高兴您学完了本节课程,关于path的一些常用方法就先讲到这里了,如果您还想了解更多的话,可以参考以下地址:

http://nodejs.cn/api/path http://nodeapi.ucdok.com/#/api/path.html

6 Node.js 字符串转换

6.1 字符串转换简介

字符串转换 Query String模块的基本介绍

Query String模块用于实现URL参数字符串与参数对象之间的互相转换,提供了"stringify"、"parse"等一些实用函数来针对字符串进行处理,通过序列化和反序列化,来更好的应对实际开发中的条件需求,对于逻辑的处理也提供了很好的帮助,下面就让我们一起来了解学习它吧!

6.2 stringify函数序列化node.js对象

stringify函数的基本用法

stringify函数的作用就是序列化对象,也就是说将对象类型转换成一个字符串类型(默认的分割符("&")和分配符("=")),本节先介绍它的基本用法,在下一节里我们将学习如何替换默认分配符,下面我们就通过以下例子来清楚的认识一下吧!

例1:querystring.stringify("对象")

var querystring= require('querystring');
var result = querystring.stringify({foo:'bar',cool:['xux', 'yys']});
console.log(result);
运行结果:
foo=bar&amp;cool=xux&amp;cool=yys

看了上面的介绍和示例,相信你对stringify函数也有了初步的了解,赶快趁热打铁,动手练一练!

"get=fire&get=ice&want=go",用stringify序列化怎么实现呢?

6.3 序列化<多参数>

stringify函数的多参数用法

这节我们来学习stringify函数的多参数用法,上节我们知道了对象被序列化为字符串之后默认是通过分割符("&")和分配符("=")组成的,那可不可以改变呢,这节我们就来了解一下,是否可以自己去定义组合结果,看下面的小例子

例1:querystring.stringify("对象","分隔符","分配符")

var querystring = require('querystring');
var result = querystring.stringify({foo:'bar',cool:['xux', 'yys']},'*','$');
console.log(result);
运行结果:
'foo$bar*cool$xux*cool$yys'

看了上面的示例,相信你已经很清楚了,分隔符、分配符是可以根据不同情况而选择给定的,那下面就亲自试试吧!

"spr#sum@spr #aut@aut#win" 练一练!

6.4 parse函数反序列化node.js对象

parse函数的基本用法

刚刚我们已经学习了stringify函数的作用,接下来就来学习反序列化函数——parse函数,parse函数的作用就是反序列化字符串(默认是由"="、"&"拼接而成),转换得到一个对象类型。如下示例:

例1:querystring.parse("字符串")

var querystring = require('querystring');
var result = querystring.parse('foo=bar&amp;cool=xux&amp;cool=yys');
console.log(result);
运行结果:
{ foo: 'bar', cool: ['xux', 'yys']}

学习了"stringify"函数,那"parse"函数也是小菜一碟啦!动手试试吧!

6.5 反序列化<多参数>

parse函数的多参数用法

现在我们学习parse函数的扩展用法,和上节stringify函数的多参数用法不同的是,parse函数可以根据用户所自定义的分割符、分配符来反序列化字符串,从而得到相应的对象结果.如下示例:

例1:querystring.parse("字符串","分隔符","分配符")

var querystring = require('querystring');
var result = querystring.parse('foo@bar$cool@xux$cool@yys','@','$');
console.log(result);
运行结果:
{ foo: '', bar: 'cool', xux: 'cool', yys: '' }

看了上面的示例,相信你已经有点跃跃欲试了,赶快传个字符串parse下吧!

6.6 课程小结

课程小结

很高兴您学完了本节课程,关于querystring的一些常用方法就先讲到这里了,如果您还想了解更多的话,可以参考以下地址:

http://nodejs.cn/api/querystring http://nodeapi.ucdok.com/#/api/querystring.html

7 Node.js 实用工具

7.1 Node.js 实用工具简介

实用工具 UTIL模块的基本介绍

关于模块的如何访问前面已经讲述过了,相信大家已经完全掌握了,这节课我们来学习util模块。util模块呢,是一个Node.js核心模块,提供常用函数的集合,用于弥补核心JavaScript的一些功能过于精简的不足。并且还提供了一系列常用工具,用来对数据的输出和验证。

7.2 用inspect函数来转换字符串

inspect函数的基本用法

util.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转换为字符串的函数,通常用于调试和错误输出。它至少接受一个参数object,即要转换的对象,我们来学习它的简单用法。使用语法如下:

var util = require('util');
var result = util.inspect(object);
console.log(result);

试一试录入任意字符对象,查看结果如何?

7.3 使用format函数将字符串格式化

format函数的基本用法

format函数根据第一个参数,返回一个格式化字符串,第一个参数是一个可包含零个或多个占位符的字符串。每一个占位符被替换为与其对应的转换后的值,支持的占位符有:"%s(字符串)"、"%d(数字<整型和浮点型>)"、"%j(JSON)"、"%(单独一个百分号则不作为一个参数)"。

1:如果占位符没有相对应的参数,占位符将不会被替换.如示例:

var util = require('util');
var result = util.format('%s:%s', 'foo');
console.log(result);
运行结果:
'foo:%s'

2:如果有多个参数占位符,额外的参数将会调用util.inspect()转换为字符串。这些字符串被连接在一起,并且以空格分隔。如示例:

var util = require('util');
var result = util.format('%s:%s', 'foo', 'bar', 'baz');
console.log(result);
运行结果:
'foo:bar baz'

3:如果第一个参数是一个非格式化字符串,则会把所有的参数转成字符串并以空格隔开拼接在一块,而且返回该字符串。如示例:

var util = require('util');
var result = util.format(1, 2, 3);
console.log(result);
运行结果:
'1 2 3'

看了上面的示例感觉怎么样,试试各种效果吧!

7.4 isArray函数来判断验证对象是否为数组

isArray函数的基本用法

isArray函数可以判断对象是否为数组类型,是则返回ture,否则为false。语法如下:

var util = require('util');
var result = util.isArray(object);
console.log(result);

试一试录入一个数组,查看结果?

7.5 isDate函数判断验证对象是否为日期

isDate函数的基本用法

isDate函数可以判断对象是否为日期类型,是则返回ture,否则返回false。语法如下:

var util = require('util');
var result = util.isDate(object);
console.log(result);

试一试录入一个日期对象,查看结果?

7.6 isRegExp函数判断验证正则

isRegExp函数的基本用法

isRegExp函数可以判断对象是否为正则类型,是则返回ture,否则返回false。语法如下:

var util = require('util');
var result = util.isRegExp(object);
console.log(result);

试一试录入一个正则,看看结果?

7.7 课程小结

课程小结

很高兴您学完了本节课程,关于util模块的一些常用方法就先讲到这里了,如果您还想了解更多的话,可以参考以下地址:

http://nodejs.cn/api/util http://nodeapi.ucdok.com/#/api/util.html

8 Node.js 子进程

8.1 子进程child_process模块简介

子进程 child_process模块的基本介绍

众所周知node.js是基于单线程模型架构,这样的设计可以带来高效的CPU利用率,但是无法却利用多个核心的CPU,为了解决这个问题,node.js提供了child_process模块,通过多进程来实现对多核CPU的利用. child_process模块提供了四个创建子进程的函数,分别是spawn,exec,execFile和fork。

8.2 spawn函数创建子进程

spawn函数的简单用法

spawn函数用给定的命令发布一个子进程,只能运行指定的程序,参数需要在列表中给出。如下示例:

var child_process = require('child_process');
var child = child_process.spawn( command );
child.stdout.on('data', function(data) {
console.log(data);
});

通过执行命令得到返回结果,我们就可以拿到标准输出流数据了。

8.3 exec函数创建子进程的回调参数

exec函数的简单用法

exec也是一个创建子进程的函数,与spawn函数不同它可以直接接受一个回调函数作为参数,回调函数有三个参数,分别是err, stdout , stderr,基本使用方法如下:

var child_process = require('child_process');
child_process.exec( command , function(err, stdout , stderr ) {
console.log( stdout );
});

exec函数可以直接接受一个回调函数作为参数,回调函数有三个参数,分别是err, stdout,stderr,非常方便直接使用,

8.4 通过execFile函数创建子进程

execFile函数的简单用法

execFile函数与exec函数类似,但execFile函数更显得精简,因为它可以直接执行所指定的文件,基本使用方法如下:

var child_process = require('child_process');
child_process.execFile( file , function(err, stdout , stderr ) {
console.log( stdout );
});

execFile与spawn的参数相似,也需要分别指定执行的命令和参数,但可以接受一个回调函数,与exec的回调函数相同。

8.5 通过fork函数运行Node.js模块

fork函数的简单用法

fork函数可直接运行Node.js模块,所以我们可以直接通过指定模块路径而直接进行操作。使用方法如下:

var child_process = require('child_process');
child_process.fork( modulePath );

该方法是spawn()的特殊情景,用于派生Node进程。除了普通ChildProcess实例所具有的所有方法,所返回的对象还具有内建的通讯通道。

8.6 课程小结

课程小结

恭喜你学完了本节课程,关于child_process的四个函数的基本简单用法,就先讲到这里了,如果您还想深入了解学习的话,可以参考以下地址:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment