官方文档:
https://nodejs.org/dist/latest-v14.x/docs/api/
- 基本概念
1. node.js 是js的runtime
2. 不包含BOM,DOM
3. 提供文件读写,网络服务和通信
4. 事件驱动,非阻塞IO
# 1 函数调用,【容易忘记最后的‘)’】
var fs = require('fs')
fs.readdir('.',function(error,data){})
# 2 函数定义
var isFile =function(name){
var fileEnd = path.extname(name)
return fileEnd !== ''
}
# 3 立即执行函数
https://segmentfault.com/a/1190000003902899
(function(){ ... }())
(function(){ ... })()
- 基本模块
# 1. 文件读取
var fs = require('fs')
fs.readFile('book.txt',function(error,data){
if (error){
return console.log('error') //这里return 可以阻止代码继续执行,不是返回值!
}
console.log(data.toString())
})
# 2. http 【一切请求路径从/开始,浏览器会默认加上http://127.0.0.1:3000/】
var http =require('http');
var server =http.createServer();
server.on('request',function(request, response){
// server.on('request', (request, response) => { // 箭头函数和function 对比
console.log(request.url);
// response.write('hello');
// response.write(' word');
// response.end();
response.end('hello word!'); //只能字符串或者二进制,JSON.stringfy(product)
});
server.listen(3000,function(){
console.log('开启成功的回调函数!');
});
# 3. http简写
var http = require('http')
http
.createServer(function(req,res){
res.end('test')
})
.listen(3000,function(){
console.log('running..')
})
- 作用域【require】,exports
# 1. 作用域
node中没有全局作用域,只有模块作用域
外部不能访问内部,内部不能访问外部,require的互相模块独立
# 2. 注意
require可以省略后缀
require不能省略相对路径./
# exports ,每个模块都有一个叫module对象,module有一个exports对象,exports === module.exports
require: 执行模块代码,并且返回被导出模块的接口对象exports
exports:每个模块都提供的一个对象,默认是空对象
导出单个成员:(拿到的就是函数或者字符串等)
module.exports = ‘test’ //exports 是module.exports的一个引用,如果 exports = ‘test’了,引用就断开了 ,可以理解为python中的dic指针
导出多个成员:(拿到的是对象,里面的内容需要点出来)
exports.foo = 'bar'
exports.add = function(){}
或者:
module.exports = {
foo: 'bar',
add: function(){}
}
导出会有问题:
exports = {foo = 'bar'} // exports.foo是修改属性 ,exports= 直接修改了引用了
- 编码问题和Content-Type
#1
response.end('hello 世界'); 浏览器会显示乱码
【原因】服务器默认发送end是utf8编码内容,浏览器在不知道服务器编码的情况下默认采用操作系统的编码去解析,中文系统会用gbk
【解决】服务器告诉浏览器编码类型,response.setHeader('Content-Type','text/plain;charset=utf-8')
#2
html格式在head中加入
<meta charset="UTF-8">
- art-template/服务端渲染和客户端渲染
http://aui.github.io/art-template/zh-cn/docs/
// 1. 安装
npm install art-template //该命令会下载到命令执行的目录,包括依赖,不要修改下载的东西
// 2. 将模板源代码编译成函数并立刻执行
template.render(source, data, options);
// 3.没有模板引擎的方法
server.on('request', function (req, res) {
var url = req.url
fs.readFile('./template.html', function (err, data) {
if (err) {
return res.end('404 Not Found.')
}
fs.readdir(wwwDir, function (err, files) {
if (err) {
return res.end('Can not find www dir.')
}
// 2.1 生成需要替换的内容
var content = ''
files.forEach(function (item) {
// 在 EcmaScript 6 的 ` 字符串中,可以使用 ${} 来引用变量
content += `
<tr>
<td data-value="apple/"><a class="icon dir" href="/D:/Movie/www/apple/">${item}/</a></td>
<td class="detailsColumn" data-value="0"></td>
<td class="detailsColumn" data-value="1509589967">2017/11/2 上午10:32:47</td>
</tr>
`
})
// 2.3 替换
data = data.toString()
data = data.replace('^_^', content)
// 3. 发送解析替换过后的响应数据
res.end(data)
})
})
})
//3
<tbody id="tbody">^_^</tbody>
// 4.模板引擎的方法
fs.readFile('./template-apache.html', function (err, data) {
if (err) {
return res.end('404 Not Found.')
}
fs.readdir(wwwDir, function (err, files) {
if (err) {
return res.end('Can not find www dir.')
}
// 这里只需要使用模板引擎解析替换 data 中的模板字符串就可以了
// 数据就是 files
// 然后去你的 template.html 文件中编写你的模板语法就可以了
var htmlStr = template.render(data.toString(), { // 模板引擎需要操作字符串,这里要toString
title: '哈哈',
files: files
})
// 3. 发送解析替换过后的响应数据
res.end(htmlStr)
})
})
//4
<tbody id="tbody">
{{each files}}
<tr>
<td data-value="apple/"><a class="icon dir" href="/D:/Movie/www/apple/">{{$value}}/</a></td>
<td class="detailsColumn" data-value="0"></td>
<td class="detailsColumn" data-value="1509589967">2017/11/2 上午10:32:47</td>
</tr>
{{/each}}
</tbody>
// 5. 服务端渲染和客户端渲染
1. 评论表,使用ajax 采用客户端渲染,用户体验好,但是不能被爬虫爬取,不利于SEO搜索引擎优化
2. 商品列表,采用服务端渲染,能被爬虫爬取,利于SEO搜索引擎优化