Node.js学习笔记 (一) Node介绍以及环境安装

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l1336037686/article/details/85471681

Node介绍以及环境安装

1.什么是Node

1.1 Node简介

Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。

  • Node使用JavaScript 作为开发语言,大部分基本模块都用JavaScript编写

  • Node既不是语言,也不是框架,它是一个平台

  • Node采用Google开发的V8引擎运行js代码,使用事件驱动、非阻塞和异步I/O模型等技术来提高性能,可优化应用程序的传输量和规模

  • 在Node中没有 BOM和DOM

2.Node能做什么

  • Web服务API,比如REST
  • 实时多人游戏
  • 后端的Web服务,例如跨域、服务器端的请求
  • 基于Web的应用
  • 多客户端的通信,如即时通信

3. Node的安装与环境搭建

3.1 怎么安装Node

傻瓜式操作,一直下一步就可以了

具体操作略

3.2 Node的目录结构

在这里插入图片描述

  • node_modules : node包目录
  • node.exe : node启动文件
  • npm.cmd : npm启动文件

4. Node中的JavaScript

4.1 CommonJS规范

4.1.1 ECMAScript标准的缺陷

  • 没有模块系统
  • 标准库较少
  • 没有标准接口
  • 缺乏管理系统

4.1.2 模块化

  • 如果程序设计的规模达到了一定程度,则必须对其进行模块化。
  • 模块化可以有多种形式,但至少应该提供能够将代码分割为多个源文件的机制。
  • CommonJS 的模块功能可以帮我们解决该问题。

4.1.3 CommonJS规范

  • CommonJS规范的提出,主要是为了弥补当前JavaScript没有模块化标准的缺陷。

  • CommonJS规范为JS指定了一个美好的愿景,希望JS能够在任何地方运行。

  • CommonJS对模块的定义十分简单:

    • 1.模块引用

      在规范中,定义了require()方法,这个方法接手模块标识,以此将一个模块引入到当前运行环境中。在 Node 中,只能通过 require 方法来加载执行多个 JavaScript 脚本文件。
      例子

      var math = require('math');
      
    • 2.模块定义

      在运行环境中,提供了exports对象用于导出当前模块的方法或者变量,并且它是唯一的导出的出口。

      在模块中还存在一个module对象,它代表模块自身,而exports是module的属性。

      在Node中一个文件就是一个模块

      例子

      exports.xxx = function() {};
      module.exports = {};
      
    • 3.模块标识

      模块标识其实就是模块的名字,也就是传递给require()方法的参数,它必须是符合驼峰命名法的字符串,或者是以.或·..开头的相对路径、或者绝对路径。
      模块的定义十分简单,接口也十分简洁。每个模块具有独立的空间,它们互不干扰,在引用时也显得干净利落。

4.2 Node中一些核心模块

核心模块是由 Node 提供的一个个的具名的模块,它们都有自己特殊的名称标识,例如

  • fs 文件操作模块
  • http 网络服务构建模块
  • os 操作系统信息模块
  • path 路径处理模块

所有核心模块在使用的时候都必须手动的先使用 require 方法来加载,然后才可以使用,例如:

var fs = require('fs')

注:Node 中的其它的核心模块

可以使用npm安装自己所需要的模块

例如:需要安装Express Web 开发框架

npm install express

5.Node中的包管理

5.1 CommonJS的包规范由包结构包描述文件两个部分组成

  • 1. 包结构

用于组织包中的各种文件

包实际上就是一个压缩文件,解压以后还原为目录。符合规范的目录,应该包含如下文件:

package.json  描述文件
bin  可执行二进制文件
lib  js代码
doc 文档
test 单元测试
  • 2. 包描述文件

描述包的相关信息,以供外部读取分析

包描述文件用于表达非代码相关的信息,它是一个JSON格式的文件 – package.json,位于包的根目录下,是包的重要组成部分。

5.2 NPM

NPM(包管理器),基本命令

npm –v  查看版本
npm  帮助说明
npm search 包名  搜索模块包
npm install 包名  在当前目录安装包
npm install 包名 –g  全局模式安装包
npm remove 包名  删除一个模块
npm install 文件路径  从本地安装
npm install 包名 –registry=地址  从镜像源安装
npm config set registry 地址  设置镜像源

6.Node的HelloWorld

6.1 使用Node执行简单的JS代码

例子:打印Hello World

console.log("Hello World");

结果:

在这里插入图片描述

6.2 Node的模块测试

例子:创建一个math模块,然后引用模块进行加法计算

math.js

//方式一,直接使用exports对象
// exports.add = function (a,b) {
//   return a + b;
// }

//方式二,使用内置的module对象
module.exports = {
  mul : function (a, b) {
    return a * b;
  },
  add : function (a,b) {
    return a + b;
  }
}

client.js

var math = require("./math")

console.log(math.add(1,2));
console.log(math.mul(2,3));

结果:

在这里插入图片描述

6.2 Node写文件和简单的错误处理

例子:创建一个文件并写入Hello World

const fs = require("fs");

fs.writeFile('./1.txt', ' Hello Node.js', (err) => {
  if (!err){
    console.log('文件已保存!');
  }
});

结果:

在这里插入图片描述

6.3 使用Node创建简单的HTTP服务

例子:

var http = require("http");

var server = http.createServer();

server.on("request",function (request,response) {
  console.log("Hello World 3000 " + request.url);
  response.write("Hello World 3000 " + request.url);
  response.end();
})

server.listen(3000,function () {
  console.log("Hello into SimpleServer,Please require http://localhost:3000");
});



6.4 ES6中的模板字符串

例子:

let str = `
Hello 
      World
!!!!  !!!
`

//ES6新增的字符串表示方法,使用``表示模板字符串
console.log(str);

结果:

在这里插入图片描述

6.5 Node中模板引擎的使用

例子1:

var template = require("art-template");

console.log(template.render("大家好,我叫:{{ name }}",{
  name : 'zhangsan'
}));

结果:

在这里插入图片描述

例子2:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <script src="node_modules/art-template/lib/template-web.js"></script>
  <script src="node_modules/jQuery/tmp/jquery.js"></script>
  <script type="text/template" id="tmp1">
    <p>大家好,我叫:{{ name }}</p>
    <p>我今年 {{ age }} 岁了</p>
    <h1>我来自 {{ province }}</h1>
    <p>我喜欢:{{each hobbies}} {{ $value }} {{/each}}</p>
  </script>
  <script>
    var ret = template('tmp1', {
      name: 'Jack',
      age: 18,
      province: '北京市',
      hobbies: [
        '写代码',
        '唱歌',
        '打游戏'
      ]
    });
    $(function () {
      $("#hello").html(ret)
    })
  </script>

</head>
<body>
 <div id="hello">

 </div>
</body>
</html>

结果:

在这里插入图片描述

7.使用JS开发仿Apache服务器阉割版

7.1 基本目录结构

在这里插入图片描述

7.2 需求

  • 1.能根据目录访问相应资源
  • 2.可以获取提交表单信息
  • 3.有错误处理

7.3 实现代码

const http = require("http");
const fs = require("fs");
const template = require('art-template')
const url = require("url")

var comments = [
  {
    name: '张三',
    message: '今天天气不错!',
    dateTime: '2015-10-16'
  },
  {
    name: '张三2',
    message: '今天天气不错!',
    dateTime: '2015-10-16'
  },
  {
    name: '张三3',
    message: '今天天气不错!',
    dateTime: '2015-10-16'
  },
  {
    name: '张三4',
    message: '今天天气不错!',
    dateTime: '2015-10-16'
  },
  {
    name: '张三5',
    message: '今天天气不错!',
    dateTime: '2015-10-16'
  }
]


var basePath = 'E:/基础项目/HTMLandCSS_Project/nodejs-learn-demo/2.黑马Node/class_02'

http
  //创建http服务
  .createServer(function (req,res) {
    //获取url路径
    //Url {
    //   protocol: null,
    //   slashes: null,
    //   auth: null,
    //   host: null,
    //   port: null,
    //   hostname: null,
    //   hash: null,
    //   search: null,
    //   query: null,
    //   pathname: '/public/lib/bootstrap/dist/css/bootstrap.css.map',
    //   path: '/public/lib/bootstrap/dist/css/bootstrap.css.map',
    //   href: '/public/lib/bootstrap/dist/css/bootstrap.css.map' }

    //使用url模块转换url
    var baseUrl = url.parse(req.url);
    //获取基本请求路径
    var pathName = baseUrl.pathname;

    //判断是否是主页面,读取主页面文本并返回
    if(pathName === '/' || pathName === '/index') {
      fs.readFile(basePath + "/views/index.html", function (err, data) {
        if (!err) {
          var ret = template.render(data.toString(), {
            comments: comments
          });
          res.end(ret);
        } else {
          res.end('404 Not Found');
        }
      })
    }

    //判断是不是表单页面
    else if (pathName.indexOf("/post") > -1){
      //返回读取表单页面文本
      fs.readFile(basePath + "/views/post.html", function (err, data) {
        if (!err) {
          res.end(data.toString());
        } else {
          res.end('404 Not Found');
        }
      })
    }

    //判断请求是不是公共资源
    else if (pathName.indexOf("/public/") > -1) {
      console.log("index in public");
      fs.readFile("." + pathName, function (err, data) {
        if (!err) {
          res.end(data);
        } else {
          res.end('404 Not Found');
        }
      })
    }

    else if (pathName.indexOf('/pinglun') > -1){
      //转换提交的URL参数
      var comment = parseQuery(baseUrl.query);
      comment.dateTime = '2017-11-2 17:11:22';
      comments.unshift(comment);
      //重定向到主页面
      res.statusCode = 302;
      res.setHeader('Location', '/index');
      res.end();
    }

    else {
      fs.readFile("./views/404.html", function (err, data) {
        if (!err) {
          res.end(data);
        } else {
          res.end('404 Not Found');
        }
      })
    }

  })
  //监听3000端口
  .listen(3000,function () {
    console.log("Server is start up...");
  })


//转换url参数,将url参数转换为对象
var parseQuery = function (query) {
  var reg = /([^=&\s]+)[=\s]*([^&\s]*)/g;
  var obj = {};
  while (reg.exec(query)) {
    obj[RegExp.$1] = decodeURI(RegExp.$2);
  }
  return obj;
}

结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/l1336037686/article/details/85471681