继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

node基础,模块化,node全局变量global

欧米雪儿lyy
关注TA
已关注
手记 33
粉丝 64
获赞 315

node基础
什么是node?node.js 是一个让js可以运行在浏览器之外的服务器端的平台;

一、配置环境变量(add to path)配置node直接输入命令(比如输入 tim直接打开qq)

第一步:在我的计算机中-> 属性 -> 高级系统设置 -> 环境变量 -> 系统环境变量 -> path ->添加环境变量
第二步:TIM右键打开文件所在位置;复制Tim的路径,添加到环境变量中;
打开cmd 输入你配置的路径 比如 TIM

二、node切换版本
node切换版本的方法:
mac下nvm,windows:nvm-windows 切换版本
**- 回调函数**
  解决异步编程的问题,将后续的逻辑当做参数传递给另一个函数
  当函数执行后在调用传递的函数;
  前端的异步有  定时器  事件绑定  ajax  callback

**- 单线程(node) 和 多线程(Java)** 
  同一时刻只能干一件事(单线程)
  切换时间片段,切换速度很快,感觉在干很多事(多线程)
  在多线程中,如果主线程业务过重,此时会阻塞主线程;
  node可以开多个进程(进程包含线程,一个进程只能包含一个线程);

**同步异步**
异步不会阻塞主线程(在编程观念上,异步约等于多线程)

**阻塞非阻塞**
针对的是内核来说的,阻塞肯定不是异步;

**io操作**
input output  文件读写操作;

**事件环**
事件一环扣一环,可以默认有两个小本,一辈叫做当前的事件队列(同步);
异步队列(异步代码)

**node中不具备dom 和 bom**
- node 只识别js
- chrome v8引擎  快 不用考虑兼容性
-可以操作文件,操作系统及api
-而且支持模块胡(node天生自带模块化的功能)
-社区活跃(一个项目好不好,看社区 cnodejs.org)

**node使用**
- node 做中间层,通过node访问后台发送请求,
- node自己做后台开发

**全局对象(global)**
- 在文件中不声明直接可以使用,我们叫做全局变量
process:进程
Buffer:缓存区
clearImmediate: 
clearInterval: 
clearTimeout: 
setImmediate:// 立刻执行,没有执行时间
setInterval: 
setTimeout:

同步> nextTick> setImmediate > setTimeout

1)console.log(this) // this不是global,文件执行时外层有一个你看不到的闭包,
node天生自带模块化,在闭包中this指向重新更改了;

2)__dirname: node目录下文件的绝对路径;
    console.log(__dirname); d:\zhufeng\c_model\nodejs
__filename: node目录下文件的路径+ 文件
console.log(__filename); d:\zhufeng\c_model\nodejs\glabel.js

3)console.log('this is log')
console.info('this is a info')
console.error('this is error')//错误信息
console.warn('this is a warn')// 警告

// 一段代码运行的时间
console.time()
console.timeEnd()

console.time('text')
for(var i=0; i<10000000; i++){}
console.timeEnd('text')
结果: text: 10.037ms

4)**process**
- cwd
- chdir
- nextTick
// 等待同步代码执行完后再执行
process.nextTick(function() {
//异步执行
})
process.pid : 任务管理器中的进程pid(详细信息)
**配置当前运行的环境变量:**

开发配置process.env对象;
在哪个窗口配置的就在哪里使用;
window node环境 set NODE_ENV=dev
mac 环境  export NODE_ENV=dev
let url = ''';//可以动态的区分变量
if (process.env.NODE_ENV == 'dev'){
 url = 'http://localhost:8080'
} else {
url = 'http://www.zhufeng.com'
}
console.log(url)
//cd 当前操作文件,执行 set NODE_ENV=dev,然后 运行 node 当前js文件(process.js)

5)timeout
箭头函数中没有this指向,没有arguments
setTimeout (function(参数1,参数2 ){
//在node中this指向的是自己
},0,参数,参数)

6)global的5个形参,没有挂载在global上;
exports,require() ,module,__filename __dirname:
这5个形参不是global属性,不用声明,可以直接使用;
/*(function (exports,require,module,__filename,__dirname) {

})()*/

**前端js模块化**
什么是模块化:就是实现功能的一组代码,
函数写法:污染全局对象,
对象写法:可以把模块写成一个对象,所有的模块成员都放到这个对象里面
立即执行函数写法:可以达到不暴露私有成员的目的。
http://www.ruanyifeng.com/blog/2012/10/javascript_module.html

// node后台模块化
- esm import export 实现前端的模块化
- commonjs规范 规定模块化的风格:
  commonjs规范:js没有模块系统,标准化,缺乏管理工具;
1)一个文件就是一个模块,这个文件拥有独自的作用域,
     普通的变量,对象,函数都属于该模块内;
     通过require来加载模块;
     通过exports和module.exports来暴露模块中的内容;
2)所有的代码都运行在模块作用域中,不会污染全局作用域,模块可以多次加载,单只会运行一次,再次加载都会读取缓存的结果,模块的加载顺序是同步的;
3)_dirname代表当前模块文件所在的文件路径,__filename:当前模块文件夹下文件路径;
4)require(同步加载)读取一个js文件模块,返回改模块的exports对象;
5)模块内的exports:node每个文件模块都有一个exports
如何创建模块: 每个js文件都是一个模块;
如何导入一个模块 :require ;
如何导出一个模块: exports或者是module.exports
6)npm root -g 查看npm 全局包安装的位置;
7)npm init -y:初始化一个package.json文件,加上一个-y就会默认生成该文件,
   无需npm install安装package.Js 中的dependencies属性中的所有依赖包;
8)如果不想下载cnpm,npm还提供了一个滤镜管理工具:npm install -g nrm
    通过 nrm use滤镜源来切换;
9)NPM的模块加载机制:
     如果require的是绝对路径文件,查找不会去遍历每个node_modules目录,其速度最快
案例:
// ----dialog.js
class Dialog {
    constructor(){
    }
    create () {
        console.log('创建一个dialog')
    }
}
// 在exports属性上增加了一个dialog方法;

// 第一种导出
// exports.dialog = Dialog
// module.exports.dialog = Dialog

// 第二种导出 全部导出
module.exports = Dialog

// 我们自己写的文件模块,必须要加./来引用
var r = require('./dialog')// 通过require拿进来的是一个对象;
// new r.dialog().create()// 第一种导出引用
new r().create() // 第二种导出引用

// node闭包内核结构
/*
(function (exports,require,module,__filename,__dirname) {
    module.exports=exports={}//源码 都指向同一个空间
    //我们自己写的代码
       module.exports.sum = sum;
       或者
       exports.sum = sum
    // 结束
    return module.exports//源码
})()*/

**文件模块**
- 自己写的文件模块,必须以 ./方式引用

**第三方模块**
- 必须下载
  使用第三方模块安装即可,可以直接引入模块名即可

**全局第三方模块(在命令行)**
taobao 源      cnpm源(国内的)      npm(国外的)
npm install nrm -g
nrm ls 查看所有源
nrm use tabao 使用淘宝源
nrm test 测网速
// 我们可以使用淘宝  或者 cnpm去install 文件
npm root  -g  查看全局安装位置
npm config list 查看配置列表

- http-server:启动服务的第三方模块
npm install http-server -g

**本地第三方模块(在项目中使用)**
- 进入文件初始化 npm init 
- 初始化packge.json(记录安装的依赖有哪些)

- 1 开发依赖(只在开发时使用)
  npm install less --save-dev
  npm uninstall less --save-dev

- 2 项目依赖(开发上线都需要)
  npm install jquery
  npm uninstall jquery 删除依赖

 - 3 安装所有的依赖
npm install 安装所有的依赖

/*
**yarn安装(安装第三方软件)**
npm  install yarn -g
yarn init
yarn add jquery 
yarn add less -dev
yarn install 安装所有依赖
*/

- 4发布包(包由多个模块组成)
//发布自己node模块包,供别人下载,

- 1.指定一个入口文件
- 2. 需要有package.json 文件(没有他就不是一个包)
- 3. README.MD 写上包的作用
- 4. 入口文件package.json 文件里面的main.js
- 5. 进入到需要发布的文件夹内
- 6. 切换到国外源,确定源必须是npm
- 7. 注册或者登陆npm;   pm addUser
- 8. 发布 npm publish
- 9 删除发布 npm unpublish --force
- 10 重新发布版本 需要更新版本

**内置,核心模块**
- 用法同第三方模块(不需要./方式引用)
- 不需要安装
- util (继承)

let path = require('path')
// 你给他一个相对路径
let path = require('path');
// 你给他一个相对路径他给你一个绝对路径
// 加上当前的__dirname
console.log(path.resolve('a', '..', 'c.js'));
// join方法不会添加__dirname路径
console.log(path.join(__dirname,'a', '..', 'c.js'));
打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP