NODE 学习笔记(一)
NODE是什么
- NODE不是后台开发语言,我们了解的JAVA、PHP、C#、.NET(dot net)...才是后台开发语言,NODE仅仅是一个工具,一个基于V8引擎来渲染和解析JS的平台和工具(有点类似浏览器)
在真实的开发中,我们一般都把NODE安装在服务器端,这样我们就可以在服务器端编写一些JS代码来处理服务器端的业务逻辑了,
=>JS不仅仅可以在客户端浏览器中运行处理客户端业务逻辑(前端开发语言),也可以在服务器端的NODE环境下运行处理服务器端业务逻辑(后台开发语言),所以可以变相的说JS是全栈开发语言
NODE如何去执行JS代码
WebStorm:在JS文件的空白处,右键,找到 Run xxx.js 就是在WB中调取NODE环境执行我们的JS代码(目前在用WB)
在当前JS所在的文件目录中打开DOS窗口,在DOS中执行 node xxx.js 也相当于把JS代码在NODE环境下执行了
NODE的REPL命令: 打开命令行,直接输入node出现 ‘ >’ 说明已经进入REPL,
REPL(Read-Eval-Print Loop,简称REPL,“读取-求值-输出”循环)是一个简单的,交互式的编程环境。
REPL既可以作为独立单机程序,也可以被其他的程序包含在内的程序。
它提供了一种交互方式,即“执行程序,展现结果”。
它可以被用作debugging,testing 或者只是执行操作得到一些结果。
NODE的优势
- 快:基于V8引擎渲染和解析的
- NODE是单线程基于事件驱动的异步操作
- NODE提供了无阻塞的I/O操作
I/O:input/output 对文件的增删改查操作
1、JS在客户端浏览器中运行的时候是否可以对客户端本地的文件进行I/O操作?
答:不可以,因为我们要保证客户端的安全,JS做为前端开发语言是不可以操作客户端本地文件的,但是浏览器也提供了部分需要用户自主操作的功能,例如:上传图片等
2、JS在服务器端NODE环境下运行的时候是否可以对服务器上的文件进行I/O操作?
答:可以的。
学习NODE从模块开始学起
- 内置模块:自身自带的 http、url、fs 等
- http:提供HTTP服务器功能。
- url:用于解析URL。
- fs:操作文件系统。
- 其他
- 自定义模块:自己编写的
- 第三方模块:别人写好的,我们来调取使用
- 安装NODE之后自带npm命令,用来管理第三方模块的。
- 所有我们需要调取的第三方模块都在https://www.npmjs.com/这个网站中
使用npm安装模块(分两种)
1、安装到全局(global)
npm install xxx(模块名字) -g
npm uninstall xxx -g //卸载已安装在全局模块
// mac os 终端下需要在命令前加sudo
sudo npm install xxx(模块名字) -g
sudo npm uninstall xxx -g
2、安装在当前的项目下
npm install xxx(模块名字)
npm uninstall xxx
把模块安装到全局的问题:
以后不管是在哪一个项目目录下,我们都可以"通过使用命令操作的方式"来进行操作,
同时存在以下两个问题:
- 不能通过"代码导入的方式"使用这个模块;
- 安装在全局有很多时候会导致版本号冲突,例如:我之前安装的是LESS的2.7版本,以前的项目都是使用这个版本开发的,后来LESS升级了,升级到3.1,新版本和之前的版本不太一样,如果全局安装最新的,原来的项目就没办法使用LESS了
把模块安装到当前项目中的问题:
- 不能像安装在全局一样使用命令了,但是可以使用JS导入的方式,正好与全局相反
解决方案:在package.json 文件的scripts这个属性中进行配置
"scripts": { //->配置NPM脚本命令
"myScript": "lessc -v" //检查version配置
}
//这样以后在终端中只需要执行npm run myScript,就也可以通过命令操作的方式执行lessc -v这个命令了
- 在当前的项目中会有一个node_modules文件夹,里面存储的都是我们当前项目所需要使用的模块(这个文件夹很大的,当需要传递给其他人时非常的不好处理)
解决方案:上传gitHub的时候在项目目录中增加一个文件:.gitignore 这个文件中可以配置上传的时候忽略哪些文件,这些被忽略的文件就不在上传了
3.我们把一些第三方模块安装在A项目下,B项目不能直接的导入使用,如果需要的话还需要在B项目中重新的下载安装一遍(通过npm install)
解决方案:需要在安装第三方模块的时候,把当前项目 的所需要的模块清单写入到package.json的开发依赖项中(通 过以下命令)
npm install xxx --save-dev 放在开发依赖模块清单中("devDependencies")
npm install xxx --save 放在生产依赖的模块清单中("dependencies")
再来一个B项目如果还是需要这些模块,我们就没有必要一个个的安装了,只需要把package.json文件拷贝到B项目中,然后执行 npm install 即可,这样的系统就会默认按照我们的开发依赖清单一个个的下载 =>"跑环境"
那么package.json 长什么样呢?
//我们平时在做项目开发的时候,首先会在当前项目的根目录路径的终端下执行:
//npm init -y
//这样执行完成后,会在当前项目的根目录下生成一个文件:package.json
{
"name": "20170222", //->项目名称
"version": "1.0.0", //->项目的版本号
"description": "", //->当前项目的描述
"main": "temp.js", //->当前项目的主体(入口)
"dependencies": { //->当前项目依赖的第三方模块清单(生产:项目发布上线版本)
"less": "^2.7.2"
},
"devDependencies": {}, //->当前项目依赖的第三方模块清单(开发:项目正在研发)
"scripts": {//->命令脚本
"test": "echo \"Error: no test specified\" && exit 1",
"myScript": "lessc -v"
},
"keywords": [],
"author": "",
"license": "ISC"
}
在NODE环境下,它认为每一个JS都可以理解为一个单独的模块,所以我们创建模块只需要创建JS文件即可;并且每一个模块和模块之间是互不干扰的;
模块与模块之间方法的互相调用:
A模块:fn
B模块:调取fn这个方法
在node环境中,用require导入,
在导入自定义模块的时候需要加上' ./ '才可以,此处是当前路径,根据具体路径添加。
在导入第三方和内置模块的时候不能加' ./ '(特例)直接写,也不需要指定目录,直接写模块名即可,
(它自己会先到node_modules中找已经安装的第三方模块,如果没有会到内置中找,如果再没有就报错了)
var a = require('./A') // 自定义模块
var lessc = require('less') //第三方模块
var http = require('http') //内置模块
在A模块中 (A.js中)
function fn(){
console.log('my name is A')
}
//->把A模块中可以供其它模块调取使用的方法导出,只有这样其它的模块才可以调用
module.exports = {
fn:fn
}
在B模块中 (B.js中)
// ->先导入A模块
var a = require('./A')
function fn(){
console.log('my name is A')
}
a.fn();
以上仅供为自己学习总结使用,同时希望理解后的知识能对他人有所帮助,如有不妥,还望指正!在此感谢!