web服务器开发、Apache 和 Node中的模块系统

1.web服务器开发

1.1.IP地址和端口号

  • IP地址用来定位计算机

  • 端口号用来定位具体的应用程序

  • 一切需要联网的通信软件都会占用一个端口号

  • 端口号的范围从0-65536之间

  • 在计算机中有一些默认端口号,最好不要去使用

    • 例如HTTP服务的80
  • 我们在开发过程中使用一些简单好记得就可以了,例如3000、5000

  • 可以开启多个服务,但是在一台计算机

  • 获取请求者的端口号:req.socket.remoteAddress, req.socket.remotePort

var http = require('http')
var server = http.createServer()
server.on('request',function(req, res){
    res.setHeader('Content-Type','text/plain;charset=utf-8')
  res.end('hello nodejs')
})
server.listen(3000,function(){
  console.log('Server is running...')
})
  • 在服务器默认发送到数据,其实是utf-8编码的内容,解决方法:正确告诉浏览器我给你发送的内容
    • res.setHeader('Content-Type','text/plain; charset=utf-8')
    • 类型:
      • text/plain普通文本
      • text/htmlhtml格式
      • image/jpeg图片(图片不需要指定编码,去掉utf-8
  • data默认是二进制数据,可以通过 .toString转为咱们能识别的字符串
  • res.end()支持两种数据类型,一种是二进制,一种是字符串

代码风格

  • 当你采用了无分号的代码风格时,只需要注意以下情况
    • 当一行代码是以
      • (
      • [
      • `
      • 开头的时候,则在前面不上分号
      • 所以你会发现在一些第三方代码中能看到一个上来就以一个 ; 开头。

2.Apache

var wwwDir = 'c:/www/'
server.on('request',function(req,res){
    var url = req.url
    
    var filePath = '/index.html'
    if(url !== '/'){
      filePath = url
    }
    fs.readFile(wwwDir + filePath, function(err,data){
        if(err){
            return res.end('404')
        }
        res.end(data)
    })
})

  • 如何得到wwwDir目录列表中的文件名和目录名

    • fs.readdir
  • 如何将得到的文件名和目录名替换到template.html

    • template.html中余姚替换的位置预留一个特殊的标记(就像以前使用 的模板引擎的标记一样(>_<)
    • 根据files生成需要的HTML内容
    • ES6的 ` 字符串中,可以使用 ${} 来引用变量
  • art-template模板引擎

    • 下载npm install art-template
    • 该命令在哪里执行就会下载到哪里。默认会下载到node_modules目录中
    • node_modules不要改,也不支持改
    • 在浏览器中需要引用lib/template-web.js文件
    • 强调:模板引擎不关心你的字符串内容,只关心自己能认识的模板标记语法,例如{{}}被称为mustache 八字胡语法
  • 在Node中使用 art-template 模板引擎;模板引擎最早就是诞生于服务器领域,后来才发展到了前端

    • 安装npm install art-template

    • 在需要的文件模块中加载 art-template

      • 只需要使用require方法加载就可以了 : require('art-template')
      • 参数中的art-template 就是你下载的包的名字
      • 也就是说你install的名字是什么,则你require中的就是什么
      • 发送解析替换过后的响应数据
  • 图片来自哔哩哔哩Node.js视频

  • 查文档,使用模板引擎的API

  • 语法:

    • template.render('模板字符串',替换对象)
  • 服务端渲染,本质就是字符串解析替换

3.Node中的模块系统

使用Node编写应用程序主要就是在使用

  • EcmaScript语言
    • 和浏览器不一样,在Node中没有BOM,DOM
  • 核心模块
    • 文件操作的fs
    • http服务的http
    • url路径操作模块
    • path路径处理模块
    • os操作系统信息获取模块
  • 第三方模块
    • art-template
  • 自己写的模块
    • 自己创建的文件

3.1.什么是模块化

  • 文件作用域
  • 通信规则
    • 加载require
    • 导出

3.2. CommonJS模块规范

在Node中的JS还有一个很重要的概念,模块系统

  • 模块作用域
  • 使用require方法用来加载模块
  • 使用exports接口对象用来导出模块中的成员

3.2.1.加载 require

  • 语法:
var 自定义变量名 = require('模块')
  • 两个作用:
    • 执行被加载模块中的代码
    • 得到被加载模块中的exports导出接口对象

3.2.2.导出

  • Node中是模块作用域,默认文件中所有的成员只在当前文件模块有效

  • 对于希望可以被其他模块访问的成员,我们就需要把这些公开的成员都挂载到exports接口对象中就可以了

  • 导出多个成员:

    • 必须是对象

    • exports.a = 123
      exports.b = 'hello'
      exports.c = function(){
          console.log('ccc')
      }
      exports.d = {
          foo : 'bar'
      }
      
  • 导出单个成员:

    • 拿到的就是:函数或者字符串

    • module.exports = 'hello'
      
    • 以下情况会覆盖

    • module.exports = 'hello'
      module.exports = function(x,y){
          return x+y
      }
      //后者会覆盖前者
      
    • 也可以这样导出多个成员

    • module.exports = {
          add:function(){
              return x+y
          },
          str : 'hello'
      }
      

3.2.3.原理解析

  • 在一个Node中,每个模块内部都有一个自己的module对象

  • 该 module 对象中,有一个成员叫:exports 也是一个对象

  • 也就是说如果你需要对外导出成员,只用把导出的成员挂载到module.exports中

  • 我们发现每次导出接口成员的时候都需要 module.exports.xxx = xxx很麻烦

  • 专门提供变量:var exports = module.exports

    • var fooExports = require('./foo')
      console.log(fooExports)
      
    • var module = {
          exports:{
              foo: 'bar'
              add: function
          }
      }
      module.exports.foo = 'bar'
      module.exports.add = function(x,y){
          return x + y
      }
      //谁require,谁就得到这个 module.exports 这个接口对象
      //默认在代码的最后有一句
      return module.exports
      
  • exports 和 module.exports 的一个引用

    • console.log(exports === module.exports)//=> true
      
      exports.foo	= 'bar'
      
      //等价于
      
      moudle.exports.foo = 'bar'
      
    • 给 exports 赋值会断开和 module.exports 之间的引用

    • 同理,给 module.exports 重新赋值也会断开

  • 真正去使用的时候:

    • 导出多个成员:exports.xxx = xxx
    • 导出多个成员也可以:module.exports = {}
    • 导出单个成员:module.exports
    • 如果实在分不清就只使用 module.exports 也没问题
      • module.exports.xxx = xxx
      • module.exports = {}

3.3

  • exports是一个对象,我们可以通过多次为这个对象添加成员实现对外导出多个内部成员
  • 如果一个模块需要直接导出某个成员,而非挂载的方式
  • 必须module.exports = add

图片来自菜鸟教程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值