Node——three

1. cnpm淘宝镜像

https://npm.taobao.org/
在安装包的时候把npm 替换成 cnpm

不想安装cnpm又想使用淘宝的服务器来下载

npm install jquery --registry=https://registry.npm.taobao.org

也可以把该设置加入配置文件中

npm config set registry https://registry.npm.taobao.org

查看npm配置信息

npm config list

默认是国外的地址

2. 模块原理

foo.js

// 在 Node 中,每个模块内部都有一个自己的 module 对象
// 该 module 对象中,有一个成员叫:exports 也是一个对象
// 也就是说如果你需要对外导出成员,只需要把导出的成员挂载到 module.exports 中

// 我们发现,每次导出接口成员的时候都通过 module.exports.xxx = xxx 的方式很麻烦,点儿的太多了
// 所以,Node 为了简化你的操作,专门提供了一个变量:exports 等于 module.exports

// var module = {
// 	exports: {
// 	foo: 'bar',
// 	add: function
//	 }
// }

// 也就是说在模块中还有这么一句代码
// var exports = module.exports

// module.exports.foo = 'bar'

// module.exports.add = function (x, y) {
// 		return x + y
// }

// 两者一致,那就说明,我可以使用任意一方来导出内部成员
// console.log(exports === module.exports)

// exports.foo = 'bar'
// module.exports.add = function (x, y) {
// 		return x + y
// }

// 当一个模块需要导出单个成员的时候
// 直接给 exports 赋值是不管用的

// exports.a = 123

// exports = {}
// exports.foo = 'bar'

// module.exports.b = 456

// 给 exports 赋值会断开和 module.exports 之间的引用
// 同理,给 module.exports 重新赋值也会断开

// 这里导致 exports !== module.exports
// module.exports = {
// 		foo: 'bar'
// }

// // 但是这里又重新建立两者的引用关系
// exports = module.exports

// exports.foo = 'hello'

// {foo: bar}
exports.foo = 'bar'

// {foo: bar, a: 123}
module.exports.a = 123

// exports !== module.exports
// 最终 return 的是 module.exports
// 所以无论你 exports 中的成员是什么都没用
exports = {
a: 456
}

// {foo: 'haha', a: 123}
module.exports.foo = 'haha'

// 没关系,混淆你的
exports.c = 456

// 重新建立了和 module.exports 之间的引用关系了
exports = module.exports

// 由于在上面建立了引用关系,所以这里是生效的
// {foo: 'haha', a: 789}
exports.a = 789

// 前面再牛逼,在这里都全部推翻了,重新赋值
// 最终得到的是 Function
module.exports = function () {
	console.log('hello')
}

// 真正去使用的时候:
// 导出多个成员:exports.xxx = xxx
// 导出多个成员也可以:module.exports = {
// }
// 导出单个成员:module.exports

// 谁来 require 我,谁就得到 module.exports
// 默认在代码的最后有一句:
// 一定要记住,最后 return 的是 module.exports
// 不是 exports
// 所以你给 exports 重新赋值不管用,
// return module.export

main.js

var fooExports = require('./foo')
console.log(fooExports)
// 如果你实在分不清楚 exports 和 module.exports
// 你可以选择忘记 exports
// 而只使用 module.exports 也没问题
//
// module.exports.xxx = xxx
// moudle.exports = {}

3. require优先从缓存加载

main.js

require('./a')

// 优先从缓存加载
// 由于 在 a 中已经加载过 b 了
// 所以这里不会重复加载
// 可以拿到其中的接口对象,但是不会重复执行里面的代码
// 这样做的目的是为了避免重复加载,提高模块加载效率
var fn = require('./b')
console.log(fn)

a.js

console.log('a.js 被加载了')
var fn = require('./b')
console.log(fn)

b.js

console.log('b.js 被加载了')
module.exports = function () {
console.log('hello bbb')
}

结果
在这里插入图片描述

4. require标识符分析

如果是非路径形式的模块标识
路径形式的模块:
./ 当前目录,不可省略
…/ 上一级目录,不可省略
/xxx 几乎不用
d:/a/foo.js 几乎不用
首位的 / 在这里表示的是当前文件模块所属磁盘根路径
.js 后缀名可以省略

require('./foo.js')

核心模块的本质也是文件
核心模块文件已经被编译到了二进制文件中了,我们只需要按照名字来加载就可以了

require('fs')
require('http')

第三方模块
凡是第三方模块都必须通过 npm 来下载
使用的时候就可以通过 require(‘包名’) 的方式来进行加载才可以使用
不可能有任何一个第三方包和核心模块的名字是一样的
既不是核心模块、也不是路径形式的模块
先找到当前文件所处目录中的 node_modules 目录
node_modules/art-template
node_modules/art-template/package.json 文件
node_modules/art-template/package.json 文件中的 main 属性
main 属性中就记录了 art-template 的入口模块
然后加载使用这个第三方包
实际上最终加载的还是文件

如果 package.json 文件不存在或者 main 指定的入口模块是也没有
则 node 会自动找该目录下的 index.js
也就是说 index.js 会作为一个默认备选项
如果以上所有任何一个条件都不成立,则会进入上一级目录中的 node_modules 目录查找
如果上一级还没有,则继续往上上一级查找
。。。
如果直到当前磁盘根目录还找不到,最后报错:
can not find module xxx

var template = require('art-template')

注意:我们一个项目有且只有一个 node_modules,放在项目根目录中,这样的话项目中所有的子目录中的代码都可以加载到第三方包
不会出现有多个 node_modules
模块查找机制
优先从缓存加载
核心模块
路径形式的文件模块
第三方模块
node_modules/art-template/
node_modules/art-template/package.json
node_modules/art-template/package.json main
index.js 备选项
进入上一级目录找 node_modules
按照这个规则依次往上找,直到磁盘根目录还找不到,最后报错:Can not find moudle xxx
一个项目有且仅有一个 node_modules 而且是存放到项目的根目录

5.for-Each

<script>
// IE 8 不支持
// ;['abc', 'd', 'efg'].forEach(function (item, index) {
// console.log(item)
// })



// 遍历 jQuery 元素
// $.each(['abc', 'd', 'efg'], function (index, item) {
// console.log(item)
// })

console.log($('div'))

// 伪数组是对象
// 对象的原型链中没有 forEach
// 对象的原型链是 Object.prototype

// 这个 each 是 jQuery 提供的
// 这个 each 在 jQuery 的原型链中
// $('div').each(function (index, item) {
// console.log(item)
// })

// jQuery 不是专门用来遍历 jQuery 元素的
// 1. 方便的遍历 jQuery 元素
// 2. 可以在不兼容 forEach 的低版本浏览器中使用 jQuery 的 each 方法

// ;[].slice.call($('div')).forEach(function (item) {console.log(item)})

</script>

6.epress安装使用

打开官网,进入提示安装页面
http://expressjs.com/en/starter/installing.html
根据提示进行安装
在这里插入图片描述
使用express
在这里插入图片描述
具体操作

// 0. 安装
// 1. 引包
var express = require('express')

// 2. 创建你服务器应用程序
// 也就是原来的 http.createServer
var app = express()


// 在 Express 中开放资源就是一个 API 的事儿
// 公开指定目录
// 只要这样做了,你就可以直接通过 /public/xx 的方式访问 public 目录中的所有资源了
app.use('/public/', express.static('./public/'))
app.use('/static/', express.static('./static/'))
app.use('/node_modules/', express.static('./node_modules/'))

// 模板引擎,在 Express 也是一个 API 的事儿

// 得到路径
// 一个一个的判断
// 以前的代码很丑

app.get('/about', function (req, res) {
// 在 Express 中可以直接 req.query 来获取查询字符串参数
	console.log(req.query)
	res.send('你好,我是 Express!')
})

app.get('/pinglun', function (req, res) {
	// req.query
	// 在 Express 中使用模板引擎有更好的方式:res.render('文件名, {模板对象})
	// 可以自己尝试去看 art-template 官方文档:如何让 art-template 结合 Express 来使用
})

// 当服务器收到 get 请求 / 的时候,执行回调处理函数
app.get('/', function (req, res) {
res.send(`
	<!DOCTYPE html>
	<html lang="en">
	<head>
	<meta charset="UTF-8" />
	<title>Document</title>
	</head>
	<body>
	<h1>hello Express!你好</h1>
	</body>
	</html>
	`)
})

// 相当于 server.listen
app.listen(3000, function () {
	console.log('app is running at port 3000.')
})

猜你喜欢

转载自blog.csdn.net/Zjaun/article/details/87293754
今日推荐