前端人员为什么要学习服务器端开发技术?
Node官网
Node中文网
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时(运行环境),如浏览器也是js的运行环境,Node 也是JS的运行环境,但是将JS代码的应用场景扩展到了服务器端
打开 Node官网
如果不是你想要的版本,点击页面上的“DOWNLOADS” 链接,打开下载页面
下载完成之后,双击安装程序
下面以截图的方式展现安装过程,基本一路默认即可,需要注意的是安装目录不能是中文
安装过程
注意:安装完成后,桌面上并没有什么快捷方式,因为Node仅仅是一个JS的执行环境
使用Node需要用到命令行工具
如何测试Node是否安装成功呢?
打开命令行工具,这里可以使用传统的 cmd 工具,也可以使用win10中的 powershell
我们这里使用后者
按下键盘上的 windows+S 键,输入 powershell ,会搜索到powershell 工具
或者在任意位置,比如桌面,按下 shift 键同时,按下鼠标右键, 也会显示 powershell 工具
打开命令行后,输入如下命令
node -v
如果能够显示版本号,就表明node安装成功
表示当前登录系统的用户权限不足。
解决方法:
则输入如下命令进行安装
在 powershell 中输入 node -v 时,会提示 node 不是可识别的命令类似的错误信息,原因在于,没有将node可执行程序路径添加到环境变量中
环境变量添加方法,这里不再演示
首先,所有前面学习过的 ECMAScript 语法在Node中都可以使用,包括ES6的语法
那么,在Node环境下该如何执行我们的JS代码呢?
按照如下步骤,我们开始第一个node程序的编写和执行
打开任意你熟悉的开发工具,如sublime、vs code,或者记事本
新建文件 hello.js,注意这里的文件后缀名是 .js ,而不是 .html
编写如下测试代码
let ary = [12, 3, 4, 5]
ary.forEach(item => console.log(item))
找到 hello.js 文件的位置,然后按下 shift 键的同事点击鼠标右键,选择“在此处打开powershell 窗口”
在命令行中输入如下命令
node hello.js
敲击回车键后,就可以执行 hello.js 中的代码了
通过上面代码的编写和执行,我们总结如下几点
以前学习过,console 是 window 的全局对象,但是在 node 中,global 才是全局对象
Node中全局对象下有以下方法,可以在任何地方使用,global可以省略
新建一个 global.js 文件,编写下面代
global.setTimeout(() => {
console.log('timeout')
}, 2000);
运行 global.js 文件,进行测试
证明,上面的这些API确实是全局对象 global 中的
在我们不算长的js代码编写经历中,可能体会到或者体会不到,js开发有如下弊端
举例说明:
一个功能就是一个模块,多个模块可以组成完整应用,抽离一个模块不会影响其他功能的运行
那么到底如何做到模块化开发呢?
注意:这里仅仅是Node中的模块化开发规范,ES6也规定了自己的模块化开发规范
代码演示:
新建 m.js,编写如下代码
let name='李白'
var sum=(a,b)=>a+b
exports.name=name
exports.sum=sum
新建 n.js,编写如下代码
const m=require('./m.js')
console.log(m.dd)
console.log(m.ss(4,5))
运行 n.js ,可以看到结果
小编解惑
需要注意如下几点
exports.name=name
module.exports.name=name
上面案例用到了 exports.属性=属性值 的方式进行模块成员导出
还可以使用 module.exports.属性=属性值 的方式进行模块成员导出
总结:
exports是module.exports的别名(地址引用关系),导出对象最终以module.exports为准
下面证明这个结论
比如,在m.js 中编写如下代码
let name='李白'
let age=20
exports.name=name
module.exports.age=age
在 n.js 中编写下面代码
const m=require('./m.js')
console.log(m)
输出结果
{ name: '李白', age: 20 }
课件,exports 与 module.exports 确实是一个地址,也就说最后修改的都是 module.exports
再次修改 m.js
let name='李白'
let age=20
module.exports.name=age
exports.name=name
再次运行 n.js
{ name: '李白' }
在 exports 和 module.exports 中都设置了name属性,但一个将值设置成了 age 成员,一个设置成了 name 成员,最后发现还是以 module.exports 为准
这就证明了上面的结论
Node运行环境提供的API. 因为这些API都是以模块化的方式进行开发的, 所以我们又称Node运行环境提供的API为系统模块
小编解惑
在前面,我们学了很多JS的API,如 querySelector、getElementById、offsetLeft 等,这些都是浏览器提供的跟Dom或者Bom相关的功能,只不过这些API都是没有任何关系的分散的。
Node 中,也提供了很多的API,但是将这些API根据烈性存放在不同的模块中,如文件模块中就包含了很多能够操作磁盘文件的API
所以,我们可以总结如下:
下面通过几个系统模块的讲解,掌握 node 中代码编写的基本规则,以及模块引入和使用的方法
Node.js中文手册
语法:
fs.readFile(path[, options], callback)
先看案例
const fs=require('fs')
fs.readFile('m.js','utf8',(err,data)=>{
console.log(err)
console.log(data)
})
小编解惑
所以一般在处理读取的文件之前,先判断err 的值
const fs = require('fs')
fs.readFile('m1.js', 'utf8', (err, data) => {
if (err) throw err;
console.log(data)
})
语法
fs.writeFile(file, data[, options], callback)
案例
const fs = require('fs')
fs.writeFile('./demo.txt', '说点什么呢', err => {
if (err) throw err;
console.log('文件写入成功')
})
小编解惑
语法
path.join([...paths])
使用平台特定的分隔符作为定界符将所有给定的 path
片段连接在一起,然后规范化生成的路径。
小编解惑
因为不同平台的路径分隔符不统一,为了防止将路径分隔符写死,影响了程序的跨平台特性,所以需要使用路径拼接
案例
const path=require('path')
let res=path.join('public','static','images','time.jpg')
console.log(res)
windows 平台运行结果
public\static\images\time.jpg
linux 平台运行结果
public/static/images/time.jpg
代码演示:
新建文件,编写下代码
const fs=require('fs')
fs.readFile('m.js','utf8',(err,data)=>{
if(err) throw err
console.log(data)
})
在此文件所在目录中,打开命令行工具,并运行此文件,发现没有问题
若在命令行工具中,使用如下命令,向上返回一级目录
cd ..
再次执行命令
所以我们需要在代码中,根据当前编写的文件路径,获取绝对路径,然后将文件路径拼接成绝对路径,就没问题了
小编解惑
命令行工具目录,就是你打开命令行工具时的目录
如你在桌面上打开了命令行工具,那么目录就是
如果在D盘根目录下打开了命令函工具,那么目录就是
但是在代码编写时,我们其实希望以当前正在编写的文件为基础作为相对路径
别人写好的、具有特定功能的、我们能直接使用的模块即第三方模块,由于第三方模块通常都是由多个文件组成并且被放置在一个文件夹中,所以又名包。
第三方模块有两种存在形式:
https://www.npmjs.com/
开发者将开发好的第三方模块,上传到上面网站,其它开发者可以从上面下载
下载方式为命令行方式下载
下面是下载和卸载第三方模块的基本语法
根据模块的作用,分为全局安装和本地安装
npm install jquery
安装完成后,会在当前目录下创建 node_modules 目录
卸载
npm uninstall jquery
以 nodemon 模块为例
nodemon是一个命令行工具,用以辅助项目开发。
在Node.js中,每次修改文件都要在命令行工具中重新执行该文件,非常繁琐。
安装
npm install nodemon -g
卸载
npm uninstall nodemon -g
因为 npmjs.com 的服务器在国外,所有有时候下载速度很慢,或者总是断开
解决方案就是更换下载源,最好是国内的下载源
解决方案有两个
通过安装 nrm 的方式,可以选择和切换下载源
使用步骤
小编解惑
在镜像源中,cnpm 和 taobao 其实是一样的,所以选择 taobao 还是 cnpm 都可以
除了将下载地址切换为 cnpm 外,还可以直接安装 cnpm
使用 npm 安装 cnpm,同事将下载源更换为taobao
npm install -g cnpm --registry=https://registry.npm.taobao.org
安装成功后,使用 cnpm 命令安装第三方模块,如
cnpm install jquery
说明:cnpm 只是基于npm 的一个小公举
上面学习的 npm 是基于node.js 的一个包管理工具,除此之外,还有yarn,现在也非常流行
yarn 是现在非常流行的一个基于node.js的包管理工具,与 npm 可以说是双雄争霸
注意:yarn 与 cnpm 是不同的
yarn安装
除了下载安装包外,还可以从npm 中安装yarn
下面使用 npm 包安装 yarn(虽然yarn 是与npm 竞争关系,但是npm 还是和开放的允许安装 yarn)
npm install yarn -g
执行下面命令,查询yarn命令列表
yarh -h
查询 yarn 版本
yarn -v
新建一个项目,然后打开命令行工具,执行如下命令
yarn add jquery
删除模块
yarn remove jquery
小编解惑
我们发现,当使用 npm 安装模块时,会创建 node_modules 目录,此目录中存储下载的模块及其依赖的模块
这个目录中的文件存在两个问题
在个项目拷贝给他人时,删除 node_modules,他人再使用 nmp 命令进行恢复安装
这就需要一个文件能够记录,当前项目都使用了哪些模块,这个文件就是 package.json
创建package.json
默认情况下,是没有此文件的,可以使用命令生成此文件
新建项目,然后在此项目下打开命令行工具,运行如下命令
npm init -y
package.json 文件内容如下
{
"name": "package_demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
安装模块
npm install debug needle
观察 package.json 文件变化
删除node_modules
将项目拷贝给别人时,直接删除 node_modules 目录即可
恢复安装
运行如下命令,即可根据package.json 中的记录恢复安装
npm install
案例演示:
使用如下命令安装开发依赖包:gulp
npm install gulp --save-dev
查看package.json
删除 node_modules 目录
使用如下命令恢复项目依赖安装
npm install --production
查看 node_modules 中的文件变化
再次删除 node_modules,然后使用如下命令恢复开发依赖安装
npm install
发现node_modules 中多了很多文件
此文件在第一次使用npm下载模块时就会被创建
作用如下:
分成下面两种情况
require('./yhb.js') // 拥有路径和后缀
require('./yhb') // 拥有路径,但没有后缀
require('yhb')
小编解惑
如果模块没有路径,node会认为这是一个系统模块
如果模块拥有路径,node会认为这是开发者自己定义的模块文件