学习nodejs的原因:一是有需求,工作需要;二是之前在前端有接触过,也有了解到nodejs的一些知识。

下面会对前端中依赖于node或者跟node相关的东西做一些整理,当然不够全面,主要是拿一些常用的进行对比跟分析:

一、自动化构建工具  gulp   webpack  grunt

* gulp ---用于构建项目,进行压缩合并。其核心文件是gulpfile.js; 核心API语法有dist  watch  default 
 task pipe  ;gulp提供了丰富的插件库 sass  less  uglify等等
* webpack
------用于构建项目,整合模块,把浏览器不识别的语言(es6/babel)转换成浏览器识别的语言。主要依赖于webpack.config.js,其核心组成部分有:entry 
 output   moudle/rules    plugins 
 devserver等;webpack提供了丰富的加载器(loader)------url   babel     file   
 sass(对静态资源文件做管理)
注:在项目中,webpack和gulp可以同时来使用

二、css预处理器   sass  less


Sass是基于Ruby环境的,诞生于2007年,其本身的语法并不太容易让浏览器识别,但最后还是会编译出合法的CSS让浏览器使用。许多框架和工具中会用到它(如:ionic 
   mintui)

less 
是基于JavaScript环境的,2009年开源的一个项目,LESS提供了多种方式能平滑的将写好的代码转化成标准的CSS代码,很多流行框架及工具会用到它(如Bootstrap)

更多请看:css预处理器
<http://www.w3cplus.com/css/css-preprocessor-sass-vs-less-stylus-2.html>

三、版本管理工具   git     svn

git ------分布式管理,最大的特点是可以构建多个分支

svn -----集中式管理,必须要联网才能进行

注:一般的话,一个公司会选择用一个版本管理工具

更多请看:git与svn对比 <https://www.cnblogs.com/dazhidacheng/p/7478438.html>

四、es5    es6    es7

在es5中,

* var  声明可以定义、修改变量,没有值会返回一个undefined
* 用字符串的拼接:“”+变量+“”
* 函数this指向      function -----谁调用指向谁,没人调用指向window
* 对象               字面量    构造函数      原型    混合----------继承:原型继承        原型链继承   
 call  apply  
在es6中,

* let  块级作用域  ;   const    用于声明变量
* 新增数组map    forEach     [...]等方法
* 提供了模板字符串:  `  `    ${}
* 函数this指向    ()=>{}   -----this指向父级
* 对象              class类------继承:extends
注:模块的暴露和接收 <https://www.cnblogs.com/fayin/p/6831071.html>

五、模块开发的规范   AMD    CMD   commonjs规范

AMD--------------异步加载规范,核心是依赖提前引入,代表框架require.js

CMD-------------标准通用规范,核心是模块按需引入,代表框架是sea.js

commonjs-------------谷歌提供的规范,核心是模块的接收和暴露(require/import 
 module.exports/export)

六、测试工具  mocha  karma

先弄清测试、调试、联调三个概念

* 测试: 通过专门的测试工具/ 代码  对功能/项目进行整体测试(黑盒测试/白盒测试)--线下  线上--(一轮 二轮  三轮)需要写测试用例
*  调试:控制台  打断点
*  联调:前端与后端的交互   测试的是 后端的数据有没有问题network
目前能想到的就这些,还有一些其他的日后再说。


学习一个新事物,肯定是从听说到了解,再通过学习训练达到熟悉和熟练的一个阶段,在理论和实战都十分强的情况下,最后通过不断训练不断学习不断思考总结,才可能达到精通的地步。下面就node的一些基本知识做一个了解:

一、node是什么

nodejs是一个基于Chrome   v8引擎的JavaScript运行环境。它使用了一个事件驱动、非阻塞式I/O的模型,使其轻量又高效。

注:1.事件驱动:事物在执行过程中用于决策的一种策略,跟随当前时间点上出现的事物,调用一切可调用的资源该事物,使其不断出现的事物被处理  防止事物堆积。

        2.非阻塞式:i(input输出/写入)/o(output输出/写出)

        3.nodejs由C++语言编写

        4.nodejs的包管理器npm  ----------- 关于包管理器

            包管理器  npm  cnpm yarn
            相同点: 追踪package.json 进行依赖安装(npm init)

*              cnpm 是npm的镜像(实际项目开发  不推荐cnpm 因为会生成多余的依赖文件;当依赖过大,比较吃网络的情况下  
使用cnpm镜像) 
*              npm -- npm install  
//npm一个依赖接一个依赖进行安装,依赖信息会全部打印出来/安装过的再次安装会重新下载 
*              yarn-- yarn add  //并行安装 安装信息一emoji表情做展示 /安装过的再次安装  不会重新下载
       
5.简单来说,nodejs是一个编写高性能网络服务器的JavaScript工具包(用于js开发服务端程序),使用的是单线程、异步、事件驱动的一个模式。

二、node的特点

快、耗内存多

三、node与PHP相比的一些优缺点

* 优点:
            性能高

            开发效率高

            应用范围广

* 缺点:
              新、会的人少

             中间件少(函数)

              IDE(编辑器)不完善

四、node的一些基本API

* url模块
      提供的方法:

        url.parse(urlString)     url路径转换成url对象信息,用于查询url信息

        url.format(urlObject)       将url对象信息转换解析成正常的url地址

        url.resolve(from,to)           将两个url地址解析成一个完整的url路径, 
 from通常跟URL前,to  通常跟path路径  
//首先一定要引入模块 var url = require("url");
console.log(url.parse("http://localhost:3000#aaa/hh?id=name")) var str ={
protocol: 'http:', slashes: true, auth: null, host: 'localhost:3000', port:
'3000', hostname: 'localhost', hash: '#hh?id=name', search: null, query: null,
pathname: '/aaa', path: '/aaa', href: 'http://localhost:3000/aaa#hh?id=name' }
console.log(url.format(str))
console.log(url.resolve("http://localhost:3000","/aa?id=name"))
* querystring模块
用于解析与格式化 URL 查询字符串,提供的方法有:
var querystring = require("querystring");
//querystring.escape()汉字编码,将汉字编码成计算机识别的语言
console.log(querystring.escape("哈哈哈")) //querystring.unescape()
汉字解码,将计算机语言解码成中文
console.log(querystring.unescape("%E5%93%88%E5%93%88%E5%93%88"))
//querystring.stringify() 将对象转换成字符串,逗号用&连接起来
console.log(querystring.stringify({"name":"ls","age":"22"}))
//querystring.parse() 将字符串转换成对象 console.log(querystring.parse("name=ls&age=22"))
* events模块 var EventEmitter = require("events"); //EventEmitter - 类 原型上
提供两种方法 on(进行事件,数据接收) emit(进行事件,数据推送) //定义类 class Person extends EventEmitter{};
//实例化 var person = new Person(); //定义后,可以多次触发 person.on('事件名',(data)=>{
console.log(data) }) //emit只触发一次 //person.once('事件名',(data)=>{ //
console.log(data) //}) person.emit('事件名','hello-----大白')
person.emit('事件名','hello----小可爱')
* fs模块 var fs = require("fs"); //获取文件的一些信息 fs.stat("./qs.js",(err,data)=>{
console.log(data.isFile()) //true }) //新增目录 fs.mkdir("dist",()=>{
console.log("success") }) //书写文件
fs.writeFile("./dist/c.js","console.log('ccc');",()=>{ console.log("success")
}) //追加文件内容 fs.appendFile("./dist/a.js","console.log('bbb')",()=>{
console.log("success") }) //读取文件的内容 fs.readFile("./dist/a.js",(err,data)=>{
console.log(data.toString()) //data----><Buffer 63 6f 6e 73 6f 6c 65 2e 6c 6f
67 6c 65 2e 6c 6f 67 28 27 62 62 62 27 29> }) //列出目录的东西
fs.readdir("./dist",(err,data)=>{ console.log(data) }) //重命名目录或文件
fs.rename("./dist/a.js","./dist/b.js",()=>{ console.log("success") })
//删除目录(rmdir)与文件(unlink) fs.unlink("./dist/b.js",()=>{ console.log("success")
}) fs.rmdir("./dist",()=>{ console.log("success") })
//注:rmdir只能删除空文件夹,下面是删除整个目录的写法 fs.readdir("./dist",(err,data)=>{
data.map(function(item){ fs.unlink("./dist/"+item,()=>{ fs.rmdir("./dist",()=>{
console.log("success") }) }) }) }) //同步读取目录信息
console.log(fs.readdirSync("./dist"))//[ 'a.js', 'b.js', 'c.js' ]
注:终端里面不能执行多行的表达式 ,但是终端可以进行简单逻辑计算,可以url.parse()、url.resolve()、
url.format(),只是都是在node环境下,先进入node环境,再执行这些逻辑计算。

       错误优先回调函数-- 函数先执行错误判断  函数第一个参数为错误对象  第二个参数是正常数据

五、node可以做什么

node.js可以用来解析JS代码(没有浏览器安全级别的限制),提供了很多系统级别 的API,如:文件的读写,进程的管理,网络通信等。-----搭建服务器

学习node.js 可以辅助前端开发,代替后端开发。

六、node的安装

* nodejs安装版本
        v6.9.4 LTS(长时间支持版本——-推荐) 

        V7.6.0 Current(最新版本,有些api会有变动)

注:中间为偶数位的是稳定版(推荐使用),为奇数位的是非稳定版本

* nodejs安装方法
下载安装包,然后小黑窗执行以下代码:

         npm i xxx -g(只需要安装一次)
         npm i xxx --save-dev/-D/-S(项目依赖  哪一个项目用就安装)
         npm i [email protected] -D(指定版本安装)

接下来就是用nodejs搭建我的第一个服务器,代码如下:
//搭建一个地址为http://localhost:3000的服务器 var http = require("http"); //引入node原生模块
var hostname = "localhost"; //主机名 var port = 3000; //端口号 //创建服务器 req:请求对象
res:响应对象 http.createServer((req,res)=>{
//1.charset=utf-8主要是解决中文乱码问题;2.要用单引号,双引号不起作用
res.setHeader('content-type','text/html;charset=utf-8') res.statusCode=200; //
console.log(req.url); //向服务器请求的地址路径 if(req.url!="/favicon.con"){ //写入响应信息
res.write("hi"); say(req,res); //响应结束 res.end(); } //域名端口号的监听
}).listen(port,hostname,()=>{ console.log(" 服务器已开启http://localhost:3000") })
function say(req,res){ res.write("你好啊 ---") res.end() }
写入数据信息除了在res.write()里面写入之外,还有两种写法:

一个是直接在下面写个函数,通过函数调用的方式,如上面say()函数的调用;

第二种是引入外来文件,如common.js
var hs = { fn1:function(req,res){ res.write("hello"); res.end() },
fn2:function(req,res){ res.write("hi"); res.end() } } //commonjs规范
module.exports = hs
然后在源文件server.js里面引入,再调用
//引入写法 var hs = require("./common") //调用写法 if(req.url!="/favicon.con"){
res.write("2"); hs.fn1(req,res); res.end(); }
上面搭建的方法比较复杂,下面是node搭建服务器的简洁写法
var http = require("http"); http.createServer((req,res)=>{
res.writeHead(200,{"content-type":"text/html;charset=utf-8","Access-Control-Allow-Origin":"*"})
if(req.url!="/favicon.ico"){ res.write("hello"); res.end(); } }).listen(3000)
注:

1、nodejs的三大模块分别是:内置模块(原生模块)、依赖模块、自定义模块。其中,内置模块不需要安装依赖,如http等;

自定义模块通过“./a.js”这种模式引入。

2、安装热更新:npm install supervisor -g    

      启动    supervisor xxxx.js   可以不用执行node,自动更新(supervisor )

七、前端从服务器请求数据展现于页面
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>请求数据</title>
<script src="jquery-1.11.0.js" type="text/javascript" charset="utf-8"></script>
</head> <body> <button id="btn">请求数据</button> <p></p> </body> <script
type="text/javascript"> $("#btn").click( function(){ $.ajax({ type:"get",
url:"http://localhost:3000", success:function(data){ //console.log(data)
$("p").text(data) } }); } ) </script> </html>
八、node可以选择搭配的一些框架

* Express(sails): 完善、稳定、文档全、社区大
* Koa: 超前
* Hapi:复杂(一个简单的helloworld都要做很多堆砌),适合复杂的大型项目
 

 

 

 

 

 

 

 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信