初识NodeJS
Posted 开心的小程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识NodeJS相关的知识,希望对你有一定的参考价值。
1.NodeJS是什么?
官网给出的解释是:基于Chrome V8引擎构建的javascript运行环境。
计算机只能识别机器代码(machine code或者native code)。C/C++作为低级语言,可以直接被机器识别。
但是javascript作为一种高级语言,是不能直接被识别的,需要一个东西将它转为机器语言,这个东西就是google公司提供的v8引擎。
v8引擎执行javascript代码非常快,性能非常好。
因为它使用JIT编译器(Just-In-Time Compiler),就是直接js->AST(抽象语法树)->机器码。
没有其他诸如JAVA等语言,有一个中间层转换。所以它很快。
原来只有chrome浏览器使用了v8引擎,所以javascript代码要在浏览器环境下才能运行。
v8引擎是通过C++语言的。
nodeJS也是通过C++语言编写的,它嵌入了更适合服务器代码开发的优化过的v8引擎,所以它可以运行javascript代码。
另外nodeJS内置了libuv库, 提供了很多API,诸如读写文件,网络请求,系统信息等。
通俗的解释可以是: 是javascript可以脱离浏览器环境运行的一个javascript运行环境。
2.NodeJS 的作用和优点
主要的作用是:可以让前端人员使用javascript语言开发服务端功能。并运行在服务器上。
应用:
- 开发工具--webpack
- 做中间层---可以解决跨域
- 服务端渲染--react,vue都是js,nodejs可以直接解析js;还可以连接mongo,redis,mysql数据库
优点:
- 可以创建多线程(子线程),用pm2管理线程
- 异步非阻塞I/o操作,采用事件环驱动
PS: 异步/同步针对被调用者的描述;阻塞/非阻塞是针对调用者(调用的方法)的描述。
3.NodeJS 基础内容
nodeJs中的全局对象是global。查看所有属性console.dir(global, { showHidden: true });
nodeJS中直接打印this,不是global, 是{}
// 启动运行代码的时候,为了实现模块化,代码最外层自动包裹一层函数,this指向被改变。 console.log(this); // {} --module.exports // 自执行函数的this指向全局对象 (function() { console.log(this); // global })()
global常见的可遍历属性有:
1.process
常用的参数有:
- argv 命令行参数
node app.js --config 1.config.js --port 3000 console.log(process.argv); // [ ‘/usr/local/bin/node‘, // ‘/Users/lyralee/Desktop/MyStudy/Event/server/app.js‘, // ‘--config‘, // ‘1.config.js‘, // ‘--port‘, // ‘3000‘ ]
取到的参数是一个数组,可以将其转化成一个对象,使用tj/commander工具。
具体用法如下:
// npm install commander const program = require(‘commander‘); // 1.设定版本号; // .parse(process.argv)必须有!! program.version(‘1.0.0‘); program.parse(process.argv); // 这一行代码必须有!!! // node app.js -V // 输出1.0.0 // 2.添加进程参数可选项 program.version(‘1.0.0‘) .option(‘-p, --pepper‘, ‘add pepper‘) .option(‘-a --add‘, ‘add sth‘) .option(‘-p|--pepper‘, ‘add pepper‘) program.parse(process.argv); // 这一行代码必须有 /* --help Options: -V, --version output the version number -p, --pepper add pepper -a --add add sth -p|--pepper add pepper -h, --help output usage information */ // 使用的时候node app.js -a 20 // console.log(program); /* { ... add: true, args: [20] } */ 3. 添加参数并要求赋值 program.version(‘1.0.0‘) .option(‘-a -add <value>‘, ‘add sth‘) program.parse(process.argv); // node app.js -a 20 console.log(program); /** * { * ..., * config: 20, * args: [] * } */ 4. 将命令绑定操作 program .command(‘rm <dir>‘) .option(‘-r, --recursive‘, ‘remove sth‘) .action(function(dir, cmd) { console.log(‘remove ‘ + dir + (cmd.recursive ? ‘recursively‘ : ‘‘)); // remove XXXX }) program.parse(process.argv); // 注意parse一定不能在action后面连写 5. 丰富打印日志 program.on(‘--help‘, function() { console.log(‘‘); console.log(‘Example:‘); console.log(‘ ${custom-help} --help‘); // 每个空格都有确实占一个空位 console.log(‘ ${custom-help} -h‘); }) program.parse(process.argv); // 注意parse一定不能在action后面连写 /* Example: ${custom-help} --help ${custom-help} -h */
-
env
可以设置环境当前变量。
其中在Mac中使用export
// 在命令行窗口中输入以下命令 export NODE_ENV=production node app.js // 或者 export NODE_ENV=production && node app.js // 在app.js中查看下面的值 console.dir(process.env.NODE_ENV); // “production”
在window中,使用set命令。用法如上。
也可以安装cross-env命令,可以兼容Mac和Windows
- chdir
// 对于右键直接runcode, 默认其当前目录cwd()是文件所在跟文件夹 console.log(process.cwd());// /Users/lyralee/Desktop/MyStudy/Event process.chdir(‘./server‘); // 目标文件夹名称 console.log(process.cwd()); // /Users/lyralee/Desktop/MyStudy/Event/server
-
nextTick
2.Buffer(16进制)
3.计时器/定时器类
setTimeout/ clearTimeout
setInterval/ clearInterval
setImmediate/ clearImmediate
4.node模块
模块通过在一个文件中使用自执行函数,函数内部返回内容。
// moduleA ( function sum() { } module.exports = sum; return module.exports; )() // app.js const a = require(‘./moduleA.js); // 同步读取文件 // a = (...)();===sum
有三个核心模块:fs, path, vm
1.fs模块
const fs = require(‘fs‘); try { fs.accessSync(‘/.XXXX.xx‘); // 判断一个文件是否存在 } catch(err) { // 文件不存在抛出异常;原来的exists因为回调中不是异常参数,被废弃 }
2. path模块
- path.join(),path.resolve()--拼接路径
// 1)path.join(), path.resolvec path.join(‘a‘,‘b‘); // a/b path.resolve(‘a‘, ‘b‘); // 默认在path.pwd()的后面添加路径 // /Users/lyralee/Desktop/MyStudy/Event/a/b // __dirname表示离当前文件最近的文件夹目录 // 如果是找文件的绝对路径 path.join(__dirname,‘a‘,‘b‘,‘/‘); // /Users/.../Event/server/a/b/ path.resolve(__dirname, ‘a‘, ‘b‘);// /Users/.../Event/server/a/b path.resolve(__dirname, ‘a‘, ‘b‘, ‘/‘); // / // 从上面的示例可以看出,当路径最后有/时,不能使用path.resolve
- path.dirname(dir)--取父路径
path.dirname(__dirname); // /Users/lyralee/Desktop/MyStudy/Event
- path.extname(fullname)--文件扩展名
console.log(path.extname(‘1.min.js‘)); // .js
- path.basename(fullname[, extname])---基础文件名
// 如果指定了扩展名,会返回除扩展名以外的文件名 console.log(path.basename(‘1.min.js‘)); // 1.min.js console.log(path.basename(‘1.min.js‘, ‘.js‘)); //1.min
3.vm模块--虚拟机--运行字符串代码
提供一个沙箱--纯净的执行环境;不受外面变量的影响。
const vm = require(‘vm‘); var hello = ‘morning‘; vm.runInThisContext(`console.log(hello)`); // hello is not defined eval(`console.log(hello)`); // morning eval()会受向上层作用域查找
5.nodejs代码调试方法
- 用浏览器调试:
1)node --inspect-brk app.js // 其中brk表示从第一行就打断点 2) 在浏览器地址栏中输入chrome://inspect,单击inspect
- 用vsCode调试
1)// 打开vsCode的debugger工具,点击设置,进行路径设置 2)// 点运行进行调试
以上是关于初识NodeJS的主要内容,如果未能解决你的问题,请参考以下文章
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段
使用 NodeJS 和 JSDOM/jQuery 从代码片段构建 PHP 页面