nodeAPT辅助测试
- cmd node 就可以进行APT
- ctrl+c 2次
art-template 的模板语法
{{each 数组}}
<li>{{$value}}</li>
{{/each}}
forEach 和 each
原生forEach
;['苹果','香蕉','桃子'].forEach(function(item,index){
console.log(item);
}
- 这个ie8中不支持
jquery中$.each
$.each(['苹果','香蕉','桃子'],function(index,item{
console.log(item);
}
- 低版本的jquery 支持ie8 高版本不支持
- 伪数组是对象
- 对象的原型链中没有forEach
- 对象的原型链是Object.prototype
- jquery的实例对象不能使用forEach方法。如果想要使用必须转为数组才可以使用
[].slice.call(jQuery实例对象)
- 借用slice返回数组
Array.prototype.mySlice = function () {
var start = 0
var end = this.length
if(arguments.length === 1) {
start = arguments[0]
}else if (arguments === 2) {
start = arguments[0]
end = arguments[1]
}
var tmp = []
for (var i = start; i < end; i++) {
//fakeArr[0]
//fakeArr[1]
//fakeArr[2]
tmp.push(this[i])
}
return tmp
}
var fakeArr = {
0: 'abc'
1: 'efg'
2: 'haha'
lenght: 3
}
[].mySlice.call(fakeArr) //this指向fakeArr
301: 永久重定向,浏览器会记住
302:临时重定向 浏览器不记忆
模板系统——基本规则
什么是模块化
CommonJS 模块规范
在Node中的JavaScript还有一个很重要的概念,模块系统
- 模块作用域
- 使用require放来用来加载模块
- 使用exports接口对象用来导出模块中的成员
加载required
语法:
var 自定义变量名称 = require('模块');
两个作用:
- 执行被加载模块中的代码
- 得到被加载模块中的exports导出接口对象
导出exports
- Node中是模块作用域,默认文件中所有成员只在当前文件模块有效
- 对于希望可以被其他模块访问的成员,我们就需要把这些公开的成员都挂载到exports接口对象中就可以了
导出多个成员(必须在对象中)
exports.a = 123
exports.b = 'hello'
exports.c = function () {
console.log('ccc')
}
exports.d = {
foo: 'bar'
}
导出单个成员(拿到的就是函数、字符串)
module.exports = 'hello'
//后者会覆盖前者
module.exports = function (x,y) {
return x + y
}
也可以导出多个成员
module.exports = {
add: function (x,y) {
return x + y
},
str : 'hello'
}
平常模块导出
main.js
var fooExports = require('./foo')
console.log(fooExports)
foo.js
var foo = 'bar'
function add(x,y){
return x + y
}
exports.add = add
通过.进行挂载
node main.js 将会输出 {add: [Function:add]}
如果一个模块需要直接导出某个成员,而非挂载
module.exports = add
原理理解
在Node中,每个模块内部都有一个自己的module模块
该module对象中,有成员exports也是一个对象
也就是说如果你需要对外导出成员,只需要把导出的成员挂载到module.exports
var module = {
exports: {
foo : 'bar'
}
}
module.exports.foo = 'bar'
module.exports.add = function(x,y) {
return x + y
}
默认在代码的最有有一句
return module.exports
谁require我,谁就获得module.exports
通过module.exports.xxx = xxx 有点冗余
为了简化操作 ,node中提供 var exports = module.exports
exports.foo = 'bar'
//等价于
module.exports.foo = 'bar'
console.log(exports === module.exports) //true
- 当一个模块需要导出单个成员时,直接给exports赋值不管用
即 exports = foo不管用
var exports = module.exports(引用类型赋值的是地址引用) 即exports和module.exports指向同一个对象
所以这时候exports.foo = ‘bar’ 相当于改变exports对象的属性,因为两者指向的是同一个对象,所以module.exports也添加了foo属性。而node默认return module.exports ,所以支持exports.foo = ‘bar’
然而这时候如果var exports = {} 给exports重新赋值后
改变了exports的指向,exports就不和module.exports指向一个对象了
这时候再添加属性也无法导出
module.exports = 'hello'
exports.foo = 'world'
导出hello
- 给 module.exports/exports赋值都切断了module.exports和exports的联系
module.exports = {
foo : 'bar'
}
//建立两者之间的联系
exports = module.exports
exports.foo = 'hello'
输出hello
exports.foo = 'bar' //bar
module.exports.a = 123 // bar 123
exports = {
a : 456
}
module.exports.foo = 'haha' //haha 123
exports.c = 456
exports = module.exports
exports.a = 789 // haha 789
若在上述代码后加上
module.exports = function() {
console.log('hello')
}
则会导出hello,因为module.exports重新赋值了,前面的都被推翻
- 使用时
导出多个成员:exports.xxx = xxx
导出多个成员也 : module.exports = {}
导出单个成员 module.exports = function(){}
优先从缓存加载
main.js
require('./a')
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')
}
node main.js结果为
a.js被执行了
b.js被执行了
[Function]
[Function]
由于在a中已经加载过b了,所以test中不会重复加载b,可以拿到其中的接口对象,但是不会重复执行里面的代码
目的是为了避免重复加载,提高模块加载的效率
第三方模块
- 第三方模块必须通过npm下载
- 使用的时候可以通过require(‘包名’) 来进行加载
var template = require('art-template')
既不是核心模块,也不是路径形式的模块
先找到当前文件所处目录中的node_modules目录
node_modules/art-template/package.json
node_modules/art-template/package.json文件中的main属性
main属性中就记录了art-template 的入口模块
然后加载使用这个第三方包,实际上最终加载的还是个文件
如果package.json文件不存在或者main指定的入口模块也没有
则node会自动找该目录下的index.js
也就是说index.js会作为一个默认备选项
- 建议每一个项目都要有一个package.json文件(包描述文件,就像产品的说明书一样)
该文件可以通过npm init 自动初始化出来
name 项目名字
version 项目版本
description 项目描述
entry point 项目入口文件 (很重要)
- npm install --save jquery / npm install jquery --save
不加save就不保存依赖项
即不会添加到package.json的
dependencies
- 若误删了node_modules文件,而package.json文件中记录了依赖项,可以通过
npm install
就会自动把package.json中的依赖性下载回来