终于开始整理最简单版的node笔记了。大佬们可以绕一圈~~一、前言介绍Node.js是一个基于chromeV8引擎的js运行环境。最大的特点是单线程运行,一次只能运行一个任务。使用事件驱动的非阻塞I/O模型。2.基本使用安装好node后,基本使用。1.节点脚本$nodedemo#或$nodedemo.js2。node-estring$node-e'console.log("HelloWorld")'HelloWorld3.进入REPL环境使用REPL环境(Read–eval–printloop,"read-evaluate-output"loop),可以直接运行各种JavaScript命令;如果使用参数--use_strict,REPL将以严格模式运行。进入REPL环境:node退出REPL环境:control+d$node>a=2;b=5;a+b73.全局对象和全局变量注意:node中没有window和document。global对象表示在node中使用var声明不会增加到global,即:vara=1;global.a>>undefinedprocess该对象表示Node当前进程。控制台在命令行环境中提供标准输入和标准输出。Function全局函数说明setTimeout()timerclearTimeout()terminatesetTimeouttimersetInterval()timerclearInterval()terminatesetIntervaltimerrequire()loadmoduleBuffer()操作二进制数据全局变量说明__dirname指向当前运行脚本所在目录。__filename指向当前运行的脚本文件的名称。4.模块化1.模块加载定义暴露和使用Node.js采用模块化结构,按照CommonJS规范定义和使用模块。模块和文件是一一对应的,即加载一个模块实际上就是加载一个对应的模块文件。模块加载:所有代码运行在模块作用域内,不会污染全局作用域;模块可以多次加载,但第一次加载时只会运行一次,运行结果缓存起来,稍后加载。直接读取缓存结果即可;模块的加载顺序是按照代码出现的顺序同步加载的;//加载模块1:require(path)#明确加载什么模块varcircle=require('./circle');//circle.js文件的后缀可以不写//加载模块2:require(文件名)#在node_module中直到找到varbar=require('bar');//相当于varbar=require('bar/lib/bar.js')模块定义暴露:通过exports和modul.exports暴露模块中的内容。模块中的exports:为了方便,node为每个模块都提供了一个exports变量,指向module.exports,相当于在模块头添加这句话:varexports=module.exports。对外导出时,可以给exports对象添加方法,PS:不能直接赋值(因为这样就切断了exports和module.exports的联系)//module.exportsexposesmodule.exports={userName:"Jack",sayHello:function(){return'Hello'}}//exports.property暴露exports.sex="boy";exports.checkSex=function(){return'world'}模块用法://基于上面的例子letuser=require(filename);console.log(`sex:${user.sex}`)2.内置核心模块:这些核心功能模块在安装node的时候已经内置了,不需要另外安装,直接requireimport即可使用。模块说明http提供http服务器功能url解析urlfs文件系统交互util提供一系列实用小工具path处理文件路径querystring解析url查询字符串child\_process新建子进程crypto加解密打包用于OpenSSLconsole控制台调试printDatadebuggerdebugger5.建立一个简单的服务项目目录├──index.html//写一个简单的页面├──server.js//启动服务demo└──get.js//请求demoserver.jslethttp=require('http');//服务模块leturl=require('url');//解析请求头模块letutil=require('util');//工具包模块letfs=require('fs');//文件系统模块//createServer创建服务并返回服务器letserver=http.createServer((req,res)=>{letpathname=url.parse(req.url).pathname;//解析并获取路径名console.log(`pathname:${pathname.substring(1)}`);fs.readFile(pathname.substring(1),(err,data)=>{if(err){//res.writeHead(404,{'Content-Type':'text/html'})}else{res.writeHead(200,{'Content-Type':'text/html'})res.write(data.toString());}//响应结束可不传参res.end();})});//Listen(port,host,Callback)默认端口3000server.listen(3000,"127.0.0.1",()=>{console.log("服务器已经运行,请打开浏览器输入http://127.0.0.1:3000/访问")})get.jslethttp=require('http');letutil=require('util');//调用接口http.get('http://www.baidu.com/sugrec?prod=pc&wd=%E8%8B%B9%E6%9E%9C',(res)=>{letdata='';//监控并累积数据res.on("data",(chunk)=>{data+=chunk;})//当数据获取完成时res.on("end",()=>{letresult=JSON.parse(data);console.log(`result:${util.inspect(result)}`);//打印所有返回的数据console.log(`result:${result.q}`)})})六、基于express框架搭建运行环境1.express框架介绍There有很多node框架[express,koa,sails,loopback,thinkjs,egg]可以看《关于nodejs的框架选择》。2.构建(1)安装expressgenerator#如果没有安装,先全局安装$cnpmi-gexpress-generator#安装后查看版本$express--version(2)通过generator自动创建项目//Syntax:$expressprojectnameA//创建名为Aproject的文件夹,并构建文件$expressnode1//创建node1文件夹,并构建大量文件其中,查看bin下的www核心代码:packageserves配置是直接执行这个文件"start":"node./bin/www"//创建一个servervarserver=http.createServer(app);//监听server.listen(port);(3)进入项目安装依赖包服务生成的配置文件中有package.json,但是依赖包还没有安装,先安装再执行服务。#安装依赖$npminstall#启动服务$npmstart//为启动,run可省略//默认手动成功开启服务:http://127.0.0.1:3000/(4)Jade未使用tojadefrom语法习惯和前端页面习惯完全不一样。如果要用玉,就得改变整个结构,所以这就是为什么很多人会用别的东西来代替玉。可以用自己熟悉的html代替,也可以用ejs。ejs的功能比html多很多,几乎没有学习成本。看语法就可以直接上手。EJS是一种简单高效的模板语言,可以通过数据和模板生成HTML标记文本。可以说EJS是一个JavaScript库。EJS可以同时运行在客户端和服务端。客户端安装可以直接导入文件,服务端可以用npm包安装。修改配置,打开入口文件api.js,然后找到app.set('viewengine','jade')#1.安装ejs$npmiejs-S#2.创建对应的index.html或index.htmlejs(Fileslike第三项的配置选择)#3.Configuration:#更改配置使用html:varejs=require('ejs');//app.set('视图引擎','jade');//替换为:app.engine('.html',ejs.__express);app.set('视图引擎','html');#更改配置以使用ejs:varejs=require('ejs');//app.set('视图引擎','jade');//替换为:app.set('viewengine','ejs');mark仅供参考,欢迎指正补充感谢参考:官网:http://nodejs.cn/api/express:https://www.npmjs.com/package...ejs:https://www.npmjs.com/package...阮一峰老师:https://javascript.ruanyifeng...node.js的历史进程:https://baike.baidu.com/item/...关于选择nodejs框架:https://www.jianshu.com/p/0e0。..node的until模块:https://blog.csdn.net/qq_3926...
