当前位置: 移动技术网 > IT编程>开发语言>JavaScript > 后端的规范与模块化概念

后端的规范与模块化概念

2019年07月09日  | 移动技术网IT编程  | 我要评论

目录

后端的规范与思想

分层

  • web层 (接收和发送http请求的,封装;别名controller层)
  • 业务逻辑层 (别名服务层,文件常以xxxservice为名)
  • dao层 (date access object,数据访问对象,对对象进行操作,存储是对象转为数据,读取是数据转为对象)
  • 持久层 (持久层,将数据长久的保存,如数据库)

如实现一个登陆功能:
web层: logincontroller接受参数,判断是否非法,然后传给服务层
服务层: loginservice通过dao层从数据库获取数据,拿到user和收到的数据进行比对,
dao层: 从数据库获取数据并转换为对象
domain: user对象实体

需要遵循单一职责原则

模块化

导入导出

  • es6支持导入和导出,es3,5缺乏相关概念
  • js规范缺乏管理机制,不同的库没有统一的下载地址
  • nodejs的npm包管理工具能解决这些缺陷(从中央仓库下载)

  • node引入系统自带模块时,直接require模块名即可,如果是自己的模块,则需要带上路径:

      系统自带的文件: require("http");
      用户自定义文件: require("./src/index.js");
  • 想要在另一个文件中引入当前文件的变量,则需要在本文件中将其导出:

      导出:module.export = a;  //如果导出多个请使用对象
      或者使用:exports a;
      引入: let a = import("./test.js");
           console.log(a)  

module.export与exports

  • 如果二者同时使用,那么会导出module.export的值,exports会失效;
  • module.exports === exports,说明二者最开始都是空对象且引用同一个对象




但是如果在一个模块中同时使用两种导出,那么他们的所引用的地址就不同了:
如:最开始module.exports和exports同时指向地址0x11111
在模块中exports=a;module.exports=b;之后,他们的引用地址就不同了(这里主要是说明分开导出,即写多个),所以其实无法实现两种混合导出最后导出对象拥有所有属性的情况。

因此,应尽量使用module.exports而避免使用exports来导出

为什么可以直接使用require等模块?

我们可以直接使用rquire exports module __dirname __filename等这些非系统模块,他们是在哪里定义的?
这些都是属于nodejs的模块,而nodejs的模块是运行在一个函数之中的,这个函数拥有一些参数,其中包含module等,而我们所写的内容在这个函数体的中间部分,大致长这样:

    function nodemodule(module,exports,reqiure,__filename,__dirname){
            ----------
            我们所写的内容
            ----------
            return module.export
    }

我们之所以能用这些模块,是因为被当做参数传进来了,并且返回的是module.exports,这也就是为什么exports会失效了

如何证明上述观点

上面提到模块是运行在一个函数内,且require等是被当做参数传递进来,那么我们可以尝试打印arguments,要知道arguments仅能在函数中起作用:

可以看出5个参数分别对应:exports,require,module,__filename,__dirname,可以使用arguments下标去分别验证(如argument[1]===require)

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网