学习node.js的第三天

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中的依赖性下载回来
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值