node 第一天
- 什么是node,就是个工具
- 基于v8引擎(谷歌)渲染js的工具或者环境
- 安装node
- 把js代码放到node里运行
- 基于v8引擎(谷歌)渲染js的工具或者环境
- 安装=>官网
- 安装以后.电脑自动安装了npm(node package manage)节点包管理工具: 一个js模块管理工具,基于npm 可以安装下载js模块
- 形成以node命令,可以在DOS窗口或者命令行执行: node xxx.js
- 8以下不支持es6
- npm和node是两个东西,一个是安装的,一个是js包管理的
- node中渲染和解析js
- npm都是基于node的io读写完成的
- node是执行js的
- npm是安装封装好的js的
- 如何在node中执行js
- REPL模式 read(读)=>evalute(求值))=>print(输出)=>loop(循环)
- 直接基于node来执行js文件
- 使用:
- 直接cmd里面 node回车 就可以是使用let a = 1;
- node xxx.js 运行js文件
node第二天
- node可以放在服务器上
- 然后代码放到服务器上执行(可以实现js可以是后台语言)
- node是单线程,因为他是js写的
- java/php都是多线程
- 异步无阻塞i/o操作(input/output) 对文件的读写
- 读取文件是异步
- event-driver类似于发布订阅或者回调函数
- 其实就是xx.onclick =function 就是触发的时候执行某个函数
- http/fs/url/path等专属对象
- js作为前端语言有i/o操作,只有input 的type为file,可以读取代码,实际是限制io操作
- node中运行js是不限制io操作,因为node
npm使用
npm install/uninstall xx@1.1 版本控制 全局 -g package.json 就是npm安装的项目依赖清单 npm init -y 是自动生成一个package.json清单 不-y就是逐行自己配置 webpack是最终打包,把所有的依赖(js文件)都合成一个文件 npm install --save 保存到开发依赖 npm install --save-dev 保存到生产依赖 dependencies 发布环境 devDependencies 开发环境 main: 主要入口文件,也就是开始项目启动文件
安装全局和本地命令和自定义命令
npm root / npm root -g 查找版本存储路径和全局版本存储路径
- 安装全局
- 容易造成版本重复及覆盖
- 不能基于CommonJs模块规范调用
- 安装在全局目录下的模块,大部分会生成一个xxx.cmd文件,只要有这个文件,那么xxx就是一个可执行命令
- 安装本地
- 项目单独使用
可执行命令脚本 cmd文件
- npm root -g找出全局命令所在
- 在npm页面找到有cmd文件,复制内容并且改写为打开node_modules的tkf的index.js路径
- 输入tkf命令行就会执行index.js
@IF EXIST "%dp0%\node.exe" (
"%~dp0\node.exe" "%~dp0\node_modules\tkf\index.js"
%*) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\node_modules\tkf\index.js"
%*
)
可执行脚本
- 把模块安装在本地,如果是支持命令操作的(会在node_modules的bin中生成xxx.cmd的命令文件,只不过这个文件无法在全局下执行 =>不能直接用命令(全局))
- 在package.json的scripts中配置需要执行的命令脚本 "script" : { "tkf": 'lessc -v' 属性名自己设置,属性值是需要执行的命令脚本,需要自己编写(可以自己配置命令) }
- npm run tkf / yarn tkf 这样的操作就是把配置的脚本执行
- 首先到配置清单的scripts里面查找
- 然后执行对应的属性值的脚本执行
- 执行脚本的时候,会到本地node_modules中的bin文件中查找,没有的话,向npm安装的全局目录下查找
node基础
NODE本身是基于commonjs设计的,所以模块是node的组成
- 内置模块: NODe天生提供给js调取使用的
- 三方模块: 别人做好的,基于npm使用,下载
- 自定义模块: 自己创建一些模块
Commons 模块化设计思想
AMD/CMD/ES6/MODULE都是模块化思想
- CommonJs规定,每个js都是一个单独的模块(模块是私有的,里面涉及到的值和变量及函数都是私有的,和其他js文件都是不冲突的
- CommonJs允许模块中的方法互相调用 [导出] CommonJs给每个模块都设置了一个内置的变量/属性/方法 modules: 代表当前这个模块对象(还有很多其他属性) modules.exports: 模块的这个'属性',用来导出的 exports: 是内置的一个'变量',也是用来导出当前模块属性和方法的.(module.exports和exports不是同一个东西,但是他俩的值是一样的,默认指向同一个堆内存地址)
[导入] require是CommonJ的内置变量用来导入模块的,其实导入的就是module.exports导出的东西,其实也是一个对象
CommonJs模块的特点如下
- 所有代码都运行在模块作用域,不会污染全局作用域
- 模块可以多次加载,但是只会在第一次加载时运行一次,运行结果就会缓存.以后加载都是加载缓存结果,要想再加载,需要清除缓存
- 模块加载的书序,按照其在代码中出现的顺序,CommonJs模块加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作
- 就是单例模式
- require导入的是module.exports,如果单独更改exports会有报错
- 最好就是直接使用exports,不要用新对象
let a = {
var a = 1;
function fn(val){
}
}
let b = {
var a = 1;
function fn2(){
a.fn(111)
}
}
总结:对象里面包裹参数,作用域单独使用