首页前端开发JavaScript手把手教你使用JS给通用模块写法(代码详解)

手把手教你使用JS给通用模块写法(代码详解)

时间2024-01-30 05:17:03发布访客分类JavaScript浏览778
导读:收集整理的这篇文章主要介绍了手把手教你使用JS给通用模块写法(代码详解),觉得挺不错的,现在分享给大家,也给大家做个参考。之前的文章《浅析JavaScript中时间戳运算的方法(附代码)》中,给大家了解了js中时间戳运算的方法。下面本篇文章...
收集整理的这篇文章主要介绍了手把手教你使用JS给通用模块写法(代码详解),觉得挺不错的,现在分享给大家,也给大家做个参考。

之前的文章《浅析JavaScript中时间戳运算的方法(附代码)》中,给大家了解了js中时间戳运算的方法。下面本篇文章给大家怎么使用JS给通用模块写法,我们一起看看怎么做。

模块化这个问题并非一开始就存在,WWW刚刚问世的时候,htMLJavaScriptCSSJSCSS都是后来在网景被引进浏览器的)都是极其简单的存在,不需要模块化。

模块化的需求是规模的产物,当web page进化到web application,浏览器端处理的逻辑越来越复杂,展现的样式和动画越来多,对于工程的要求也就越来越高。于是模块化的需求也就产生了。模块化的意义:

  • 组件的复用,降低开发成本和维护成本

  • 组件单独开发,方便分工合作

  • 模块化遵循标准,方便自动化依赖管理,代码优化,部署

JavaScript长久以来被认为是简单的脚本语言,实际上情况早就发生来变化,在最新版的 ECMA-262(ES6)文档中强调JavaScript是通用编程语言而不是脚本语言。脚本语言,比如shell并不是用来完成复杂功能的,只是用来做一些自动化控制,是不需要模块化的。而用于构建复杂系统通用编程语言(比如Java)一般都有模块的实现。

ES6以前,JS语言没有模块化,如何让JS不止运行在浏览器,且能更有效的管理代码,于是应运而生CommonJS这种规范,定义了三个全局变量:

require,exports,module
  • require用于引入一个模块

  • exports对外暴露模块的接口,可以是任何类型

  • module是这个模块本身的对象

require引入时获取的是这个模块对外暴露的接口(exports

Node.js使用了CommonJS规范:

VAR foo = require("foo");
    var out = foo.sayName();
    module.exports = out;
    

在浏览器端,不像Node.js内部支持CommonJS,如何进行模块化,于是出现了CMDAMD两种方式,其主要代表是seajsrequirejs,他们都定义了一个全局函数define来创建一个模块:

//CMDdefine(function (require, exports, module) {
      var foo = require("foo");
      var out = foo.sayName();
      module.exports = out;
}
    );
//AMDdefine(["foo"], function (foo) {
      var out = foo.sayName();
      return out;
}
    );
    

可以看出CMD完好的保留了CommonJS的风格,而AMD用了一种更简洁的依赖注入和函数返回的方式实现模块化。两者除风格不同外最大区别在于加载依赖模块的方式,CMD是懒加载,在require时才会加载依赖,而AMD是预加载,在定义模块时就提前加载好所有依赖。

我们要实现一个模块,让它既能在seajs(CMD)环境里引入,又能在requirejs(AMD)环境中引入,当然也能在Node.js(CommonJS)中使用,另外还可以在没有模块化的环境中用script标签全局引入。

首先搞一个模块

var factory = function () {
  var moduleName = {
}
    ;
      return moduleName;
}
    ;
    

当然return输出的可以是任何值,对象,类,其他都可以

首先满足Node.js或者ES6,我们可以通过全局变量moduleexports来判断

var factory = function () {
  var moduleName = {
}
    ;
      return moduleName;
}
    ;
    if (tyPEof module !== "undefined" &
    &
 typeof exports === "object") {
      module.exports = factory;
}
    

CMDAMD中,我们需要提供一个工厂函数传入define来定义模块,当没有上述全局变量,且有define全局变量时,我们认为是AMDCMD,可以直接将factory传入define

var factory = function () {
  var moduleName = {
}
    ;
      return moduleName;
}
    ;
    if (typeof module !== "undefined" &
    &
 typeof exports === "object") {
      module.exports = factory;
}
     else if (typeof define === "function" &
    &
 (define.cmd || define.amd)) {
      define(factory);
}
    

注意:CMD 其实也支持 return 返回模块接口,所以两者可以通用。

然后还要满足script标签全局引入,我们可以将模块放在window上,为了模块内部在浏览器和Node.js中都能使用全局对象,我们可以做此判断:

var global = typeof window !== "undefined" ? window : global;
    

我们用一个立刻执行的闭包函数将所有代码包含,来避免污染全局空间,并将global对象传入闭包函数,最终变成这样:

(function (global) {
  var factory = function () {
    var moduleName = {
}
    ;
        return moduleName;
  }
    ;
      if (typeof module !== "undefined" &
    &
 typeof exports === "object") {
        module.exports = factory;
  }
     else if (typeof define === "function" &
    &
 (define.cmd || define.amd)) {
        define(factory);
  }
 else {
        global.factory = factory;
  }
}
    )(typeof window !== "undefined" ? window : global);
    

注意:闭包前加上分号是为了给前一个模块填坑,分号多了没问题,少了则语句可能发生变化。

然后,就能愉快的调用了

//Node.jsvar myModule = require('moduleName')//Seajsdefine(function(require,exports,module){
  var myModule = require('moduleName')}
    )// browser globalscript src='moduleName.js'>
    /script>
    

【完】

推荐学习:JavaScript高级教程

以上就是手把手教你使用JS给通用模块写法(代码详解)的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

上一篇: JavaScript限制输入框只允许整数...下一篇:浅析JavaScript中时间戳运算的方...猜你在找的JavaScript相关文章 html font标签如何设置字体大小?html font标签属性用法介绍2022-05-16vue3+TypeScript+vue-router的使用方法2022-04-16vue3获取当前路由地址2022-04-16如何利用React实现图片识别App2022-04-16JavaScript展开运算符和剩余运算符的区别详解2022-04-16微信小程序中使用vant框架的具体步骤2022-04-16Vue elementUI表单嵌套表格并对每行进行校验详解2022-04-16如何利用Typescript封装本地存储2022-04-16微信小程序中wxs文件的一些妙用分享2022-04-16JavaScript的Set数据结构详解2022-04-16 其他相关热搜词更多phpjavapython程序员loadpost-format-gallery

若转载请注明出处: 手把手教你使用JS给通用模块写法(代码详解)
本文地址: https://pptw.com/jishu/592089.html
怎么将Nodejs中的buffer转为JSON格式和UTF-8字符串? 浅析JavaScript中时间戳运算的方法(附代码)

游客 回复需填写必要信息