文件命名
- 不要命名为 node.js
操作文件
var fs = require('fs');
// 读文件
// 注意,这里的 './' 相对的是执行 node 命令所处的终端路径
// 其实所有文件操作路径中,相对路径都是相对于执行 node 命令所处的终端路径
fs.readFile('./book.txt', function (error, data) {
console.log(data.toString());
});
// 写文件
fs.writeFile('./book2.txt', '床前明月光', function (error) {});
http 服务
var http = require('http');
// 创建服务器
var server = http.createServer();
// 服务器收到请求后做什么
server.on('request', function (request, response) {
res.setHeader('content-type', 'text/plain; charset=utf-8');
res.end('从前有座山');
});
// 启动服务器
server.listen(3000, function (error) {});
响应内容类型 Content-Type
Node 中的 JavaScript
- ECMAScript
- 核心模块
- Node 为 JavaScript 提供的服务器级别的 API,这些 API 绝大多数都被封装到了一个具名的核心模块中
- 第三方模块
- 用户自定义模块
- 通过 require(‘./文件名’) 互相加载
- 在 node 中,没有全局作用域,只有模块作用域
- 相对路径中的 ‘./’ 不能省略,不然会被当做核心模块
- 每个文件模块中都提供了一个对象:exports,它是一个空对象,其他模块可以通过 require() 方法接收到该对象
Node 中的模块系统
使用 Node 编写程序主要就是在使用:
- ECMAScript
- 核心模块
- 文件操作的 fs
- http 服务的 http
- url 路径操作模块
- path 路径处理模块
- os 操作系统信息
- 第三方模块
- art-template
- 必须通过 npm 来下载才可以使用
- 自己写的模块
path 路径操作模块
path.basename()
获取路径文件名。
第一个参数是路径。
第二个参数是要去掉的文件后缀名。
path.basename('c:/a/b/c/index.js'); // 'index.js'
path.basename('c:/a/b/c/index.js', '.js'); // 'index'
path.dirname()
获取目录路径名。
path.dirname('c:/a/b/c/index.js'); // 'c:/a/b/c'
path.extname
获取文件扩展名。
path.extname('c:/a/b/c/index.js'); // '.js'
path.isAbsolute()
判断是否是绝对路径。
path.isAbsolute('c:/a/b/c/index.js'); true
path.parse()
综合的一个方法。
path.parse('c:/a/b/c/index.js');
{
root: 'c:/',
base: 'index.html',
ext: '.html',
name: 'index'
}
path.join()
拼接路径。
path.join('c:/a/b', 'c'); // 'c:\\a\\b\\c'
path.join('c:', 'a', '/b', './c'); // 'c:\\a\\b\\c'
Node 中的其它成员
在每个模块中,除了 require、exports 等模块相关 API 之外,还有两个特殊的成员。
- __dirname
- 可以用来获取当前文件模块所属目录的绝对路径,不包含文件名
- __filename
- 可以用来获取当前文件的绝对路径,包含文件名
在文件操作中,使用相对路径是不可靠的,因 为在 Node 中文件操作路径被设计为 相对于执行 node 命令所处的终端路径(不是 bug,有其他用处)。
所以为了解决这个问题,应该使用绝对路径。
补充:模块中的路径标识和这里的路径没有关系,不受影响,就是相对于文件模块
art-template
在 浏览器 中使用模板引擎
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script src="./node_modules/art-template/lib/template-web.js"></script>
<script type="text/template" id="tpl">
hello {{ name }}
</script>
<script>
var ret = template('tpl', {
name: 'Jack'
});
console.log(ret);
</script>
</body>
</html>
在 node 中使用模板引擎
var template = require('art-template');
var tplStr = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>大家好</h1>
<p>我是 {{ name }}</p>
<p>今年 {{ age }}岁了</p>
</body>
</html>
`
var ret = template.render(tplStr, {
name: 'harry',
age: 20
});
console.log(ret);
var template = require('art-template'),
http = require('http'),
fs = require('fs');
var server = http.createServer();
server.on('request', function (req, res) {
fs.readFile('./art-template.html', function (error, data) {
res.setHeader('content-type', 'text/html; charset=UTF-8')
var str = data.toString();
var ret = template.render(str, {
name: 'harry',
age: 20
});
res.end(ret);
});
});
server.listen(3000, function () {
console.log('服务器启动了');
});
在服务端使用模板引擎就是实现了服务端渲染。
模板引擎最早诞生于服务端。
服务端渲染和客户端渲染的区别
- 客户端渲染不利于 SEO 搜索引擎优化
- 服务端渲染是可以被爬虫抓取到的,而客户端渲染很难被爬虫抓取,那么意味着用客户端渲染来渲染商品列表搜索引擎就搜索不到商品
node 中的 console
打开方式:在 terminal 中任意目录下输入 node 命令
作用:用来测试,不需要 require 加载核心模块
CommonJS 模块规范
在 Node 中的 JavaScript 有一个重要的概念:模块系统。
- 模块作用域
- 使用 require 方法加载模块
- 使用 exports 接口对象导出模块中的成员
优先从缓存加载
自形领会
npm
node package manage
package.json
建议每一个项目都有一个 package.json 说明文件。
这个文件可以通过 npm init 的方式自动初始化出来。
目前来讲,最有用的是 dependencies 选项,可以用来帮我们保存第三方包的依赖信息。
建议:
- 每个项目的根目录下都有一个 package.json 文件
- 执行
npm install 包名
的时候都加上--save
这个选项,用来保存依赖项信息
这样的话如果我们的 node_modules
不小心被删除了,就可以通过 npm install
命令自动把 package.json
中的 dependencies 中的所有依赖项都下载回来。
npm 常用命令
- npm init
- npm init -y 可以跳过向导,快速生成[–yes]
- npm install
- npm i
- npm install 包名
- npm i 包名
- npm install --save 包名
- npm i -S 包名
- npm uninstall 包名
- 只删除,依赖项会保存
- npm uninstall --save 包名
- 删除的同时会把依赖信息也去除
- npm un -S 包名
解决 npm 被墙问题
方法一:
# 安装淘宝的 cnpm
# 以后安装包的时候把 npm 替换成 cnpm
npm install --global cnpm
方法二:
npm install 包名 --registry=https://registry.npm.taobao.org
方法三:
# 配置之后一劳永逸
npm config set registry https://registry.npm.taobao.org