(在Node.js这个执行环境中为JavaScript提供一些服务器级别的api,这些api大多包装到一个具名的核心模块中)
- fs 文件操做模块
- http 网络服务构造模块
- OS 操做系统模块
- path 路径处理模块
- url 路径操做模块
复制代码
node没有全局做用域。在Node.js中,经过require方法加载和执行多个JavaScript脚本文件。文件与文件之间因为是模块做用域,即便加载执行多个文件,能够彻底避免变量命名冲突污染。可是某些状况下,模块与模块是须要进行通讯的,可经过require方法得加载文件模块导出的接口对象。即:php
每一个模块都提供一个接口对象,默认为空对象,把须要被外部访问的成员挂载在exports接口对象css
b.js中
exports.a = 123
exports.b = 'hello'
exports.c = function () {
console.log('ccc')
}
exports.d = {
foo: 'bar'
}
a.js中
var bExports = require('./b')//require加载模块时,可省略后缀名
console.log(bExports.d)
复制代码
b.js中
module.exports = 'hello'
module.exports = function () {
console.log(ccc)
}
module.exports = {
add: function () {
return x + y
},
str: 'hello'
}
会发生覆盖,只拿到最后一个
a.js中
var bExports = require('./b')
console.log(bExports)
复制代码
//在 Node 中,每一个模块内部都有一个本身的 module 对象,还有一个成员exports(也是一个对象)
当对外导出成员,只须要把导出的成员挂载到 module.exports 中
var module = {
exports: {
foo: 'bar',
add: function (x, y){
return x + y
}
}
}
//添加或导出成员 modeule.exports.xxx = xxx,为了简化你的操做,专门提供了一个变量:exports 等于 module.exports
var exports = module.exports
//当二者一致时,能够经过任何一个添加和导出内部成员如:
exports.a = 'hello'
module.exports.b = 'hi'
//当一个模块须要导出单个成员的时候,只能给module.exports赋值,给 exports直接 赋值是无论用的,由于exports的指向发生改变,而模块的接口对象是module.exports。
//同理,给 module.exports 从新赋值,指向改变,断开和exports的引用
复制代码
4.2 require的加载规则html
即根据模块标识来加载即:require('模块标识符')
1.本身写的模块
路径形式的模块:1./ 当前目录,不可省略 , 2../ 上一级目录,不可省略 3.js 后缀名能够省略
var b = require('./foo.js')
var b = require('./foo')
2.核心模块
核心模块的本质也是文件,已经被编译到了二进制文件中(下载后,编译在node.exe),咱们只须要按照名字来加载就能够了
var http = require('http')
var fs = require('fs')
3.第三方模块
凡是第三方模块都必须经过 npm 来下载
使用的时候就能够经过 require('包名') 的方式来进行加载才可使用
如: var template = require('art-template')
整个加载过程当中:
先找到当前文件所处目录中的 node_modules 目录
node_modules/art-template
node_modules/art-template/
node_modules/art-template/package.json
node_modules/art-template/package.json 文件中的 main 属性
main 属性中就记录了 art-template 的入口模块
若是 package.json文件不存在或者main指定的入口模块是也没有,自动找该目录下的 index.js,index.js 是做为一个默认备选项
若是以上全部任何一个条件都不成立,进入上一级目录找 node_modules
按照这个规则依次往上找,直到磁盘根目录还找不到,最后报错:Can not find moudle xxx
一个项目有且仅有一个 node_modules 并且是存放到项目的根目录
- 优先从缓存加载:再次加载某个模块,不会执行里面的代码,但能够从缓存中拿到其中的接口对象,这样能够避免重复加载,提升模块加载效率
复制代码
- npm --version版本
- npm install --global npm 升级
- npm init自动初始化package.json文件
- npm init -y跳过向导,快速生成
- npm install一次性把package.json文件的dependencies选项的全部依赖项下载回来
- npm install art-template只下载
- npm install art-template --save下载并保存到dependencies选项
- npm uninstall art-template删除,依赖项依然存在
- npm install art-template --save删除同时删除依赖信息
复制代码
npm存储包文件的服务器在国外,有时会速度很慢。前端
淘宝开发团队把npm在国内做了个备份淘宝 NPM 镜像java
安装淘宝cnpmnode
在任意目录执行均可以
--global表示安装到全局,而不是当前目录
npm install --global cnpm
cnpm intstall art-template
若是不想安装cnpm又想用淘宝的服务器下载
npm install art-template --registry=http://registry.npm.taobao.org
每次手动添加后面的参数很麻烦,能够把这个选项加入配置文件中
npm config set registry=http://registry.npm.taobao.org
查看npm配置信息是否成功
npm config list
通过上面命令的配置,之后全部的```npm install```均可以经过淘宝服务器来下载
复制代码
每一个项目都应该有个package.json文件,经过npm init自动初始化出来git
PS E:\迅雷下载\14Nodejs教程精讲(7天+5天赠送)\nodejs资料(7天)\03\code> npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help json` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
package name: (code)
version: (1.0.0) 0.0.1
description:
entry point: (index.js) main.js
test command:
git repository:
keywords:
author: zhanglichun
license: (ISC)
About to write to E:\迅雷下载\14Nodejs教程精讲(7天+5天赠送)\nodejs资料(7天)\03\code\package.json:
{
"name": "code",
"version": "0.0.1",
"description": "",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "zhanglichun",
"license": "ISC"
}
复制代码
再经过npm install art-template --save来下载第三方包,web
{
"name": "code",
"version": "0.0.1",
"description": "",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "zhanglichun",
"license": "ISC",
"dependencies": {
"art-template": "^4.13.2"
}
}
复制代码
package.json文件多了dependencies这个选项,可保存第三方包的依赖信息。数据库
若是node_modules不当心被删,可经过npm install,自动地把package.json里的dependencies中全部的依赖项下载回来apache
问题:每次修改完有关Node.js的代码时,都要在命令行工具(cmd等)ctrl+c重启
解决:使用第三方命令行工具nodemon ,来帮咱们解决修改代码频繁启动服务器的问题
nodemon是基于Node.js开发的第三方命令行工具,使用时咱们须要独立安装
--global是全局安装,在任意目录执行该命令均可以
npm install --global nodemon
复制代码
安装完毕,经过nodemon app.js启动服务,它会监视文件变化,当文件发生变化时,自动重启服务器
301 永久重定向,浏览器会记住,除非清除浏览器数据
302 临时重定向,浏览器不会记住,会从新发出请求
res.statusCode=302/res.setHeader('Location','/')
在每个模块中,除了require、exports等模块相关的API外,还有两个特殊成员
__dirname 动态获取当前文件模块所属目录的绝对路径
__filename 动态获取当前文件的绝对路径
在文件操做中,相对路径是是不可靠的,由于在node文件操做路径被设计为相对于执行 node 命令所处的终端路径,因此在文件操做中的相对路径都统一转为 动态的绝对路径
在拼接过程当中,为了不手动拼接带来的低价错误,使用path.join(__dirname, './a.txt')来辅助拼接
补充:模块中的路径标识和这里的路径无关
var fs = require('fs')
var template = require('art-template')
var server = http.createServer()
var wwwDir = 'D:/movie/www/'
server.on('request', function (req, res) {
// 1.准备模板===读取template-apache.html
fs.readFile('./template-apache.html', function (err, data) {
if (err) {
return res.end('404 Not Found')
}
// 2.准备数据===获取www目录列表
fs.readdir(wwwDir, function (err, files) {
if (err) {
return res.end('404 Not Found')
}
// 3.使用模板引擎生成html内容,返回客户端
var htmlStr = template.render(data.toString(), { files: files })
res.end(htmlStr)
})
})
})
server.listen(3000, function (req, res) {
console.log('running.....')
})
template-apache.html的模板
<tbody id="tbody">
{{each files}}
<tr>
<td data-value=""><a class="icon dir" href="/D:/Movie/www/">{{$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>
复制代码
文件操做路径
在文件操做的相对路径中能够省略 ./
./data/a.txt 相对于当前目录
data/a.txt 相对于当前目录
/data/a.txt 绝对路径,当前文件模块所处磁盘根目录
c:/xx/xx... 绝对路径
fs.readFile('./data/a.txt', function (err, data) {
if (err) {
console.log(err)
return console.log('读取失败')
}
console.log(data.toString())
})
复制代码
模块路径
在模块加载中,相对路径中的不能省略./,同时后缀名能够省略
require(./data/a.txt) require(./data/a) 相对于当前目录
require(data/a.txt) 报错:Cannot find module 'data/a.txt'
require('/data/foo.js') C盘下没有,报错:Cannot find module 'C://data/a.txt'
复制代码
{{each 数组}}
<li>{{ $value }}</li>
{{/each}}
复制代码
;['abc', 'd', 'efg'].forEach(function (item, index) {
console.log(item)
})
复制代码
$.each(['abc', 'd', 'efg'], function (index, item) {
console.log(item)
})
复制代码
$('div').each(function (index, item) {
console.log(item)
})
复制代码
[].slice.call(jQuery实例对象
原理是
Array.prototype.mySlice = function () {
var start = 0
var end = this.length
var tmp = []
for (var i = start; i < end; i++) {
// fakeArr[0]
// fakeArr[1]
// fakeArr[2]
tmp.push(arguments[i])
}
return tmp
}
var fakeArr = {
0: 'abc',
1: 'efg',
2: 'haha',
length: 3
}
// 因此你就获得了真正的数组。
[].mySlice.call(fakeArr)
复制代码
9.4 软件开发版本
x.x.x
好比:2(新增功能比较多,甚至可能去除了某些功能).5(加入了新功能).0(修复bug,提高性能)
复制代码