美文网首页
1.webpack笔记1-模块化,以及几种规范

1.webpack笔记1-模块化,以及几种规范

作者: wudimingwo | 来源:发表于2018-11-23 22:44 被阅读0次
image.png

什么是模块化? 网上的
什么是模块化(一)
当我们在多个 JavaScript 文件之间进行通讯时,
所以如何解决命名冲突和文件依赖的问题呢?
解决方法就是:限制作用域,并且移除全局变量。
而解决以上两个问题的做法就是模块化
这个博客里写conmmonJS的时候,

// lib.js
var counter = 3;
function incCounter() {
  counter++;
}
module.exports = {
  counter: counter,
  incCounter: incCounter,
};
// main.js
var counter = require('./lib').counter;
var incCounter = require('./lib').incCounter;

console.log(counter);  // 3
incCounter();
console.log(counter); // 3

据此得出结论:一旦输出一个值,模块内部的变化就影响不到这个值。
这个结论是有问题的. 之所以影响不到是因为 counter 是个原始值.
如果改成 counter.num++ counter变成引用值,则还是有效果的.
(吓我一跳,如果影响不到,那各种变量岂不是都用不了?)

什么是模块化,模块化开发如何实现?;
模块化就是讲js文件按照功能分离,根据需求引入不同的文件中。源于服务器端。

模块化实现(好处,原因)
什么是模块化呢?《 Java 应用架构设计:模块化模式与 OSGi 》一书中对它的定义是:模块化是一种处理复杂系统分解为更好的可管理模块的方式。

image.png
image.png
image.png

common.js

main.js

var m1 = require("./m1.js");
var m2 = require("./m2.js");
var m3 = require("./m3.js");
 m1.fn();
 m2();
 m3.fn();

m1.js

module.exports = {
  name : "m1",
  fn : function () {
    console.log(this.name);
  }
}

m2.js

module.exports = function () {
    console.log("m2");
}

m3.js

exports.fn = function () {
    console.log("m3");
}

用git 执行 node main.js


image.png
image.png
image.png
image.png

我让main.js 依赖 m3, m3 依赖 m2 和 m1
index.html 注意要用 data-main 指定主要的js文件.

         <script src="https://cdn.bootcss.com/require.js/2.3.6/require.js" data-main= "main.js"></script>

main.js

(function () {
  require.config({
    paths : {
      m3 : "./m3",
      m2 : "./m2",
      m1 : "./test/m1",
      jquery : "http://libs.baidu.com/jquery/2.0.0/jquery.min"
      // 这里末尾添加 .js 会报错
      // 可以引入cdn
    }
  })
  require(["m3"],function (num) {
    console.log(num.num);
  });
    
    require(["jquery"],function ($) {
        $("body").css({"background":"red"});
    })
    
})();

test/m1.js

define(function () {
  var num = 1;
  
    return {
      num:num
    }
})

m2.js

define(function () {
    var num = 2;
    
    return {
      num : num
    }
})

m3.js

define(["m1","m2"],function (num1,num2) {
    var num = num1.num + num2.num;
    
    return {
      num : num
    }
})

image.png
image.png

cmd
index.html

<script src="https://cdn.bootcss.com/seajs/3.0.3/sea.js"></script>
        <script type="text/javascript">
            // 指定主要js
            seajs.use("http://127.0.0.1:8020/server/commonjstest/main.js");
            // 这里我的sea.js不是跟main.js同目录下的,所以要填绝对路径,,尼玛
            // 后面的都要改成绝对路径, 否则默认从 sea.js所在文件夹中去找.
        </script>

m1.js

define(function (require,exports,module) {
  var num = 1;
  
    exports.num = num;
})

m2.js

define(function (require,exports,module) {
  var num = 2;
  
  exports.num = num;
})

m3.js

define(function (require,exports,module) {
  var num = 3;
  // 这是异步加载, 加载完之后执行 回调函数里的语句.模块参数放在回调函数中的参数
// 类似amd规范
  require.async("http://127.0.0.1:8020/server/commonjstest/m2.js",function (m2) {
    console.log(m2.num);
  })
  // 这是同步加载, 阻塞进程,控制执行顺序, 类似 cmd规范
  var m1 = require("http://127.0.0.1:8020/server/commonjstest/test/m1");
  console.log(m1.num);
  
  module.exports = {
    num
  }
  
})

main.js

(function () {
  define(function (require,exports,module) {
    var m3 = require("http://127.0.0.1:8020/server/commonjstest/m3");
    console.log(m3.num);
    require.async("http://libs.baidu.com/jquery/2.0.0/jquery.min.js",function ($) {
        $("body").css({"background":"red"});// 报错, $ is not defined
    })
  })
  
    
})();
image.png

执行顺序就不说了,先执行同步的主线程的,然后再执行事件里的.
这里发现jq无法引入, 表明 jq 是不支持sea.js的. 呵呵,看来用的人是不是不多啊?
jq源码是支持 amd的

    if ( typeof define === "function" && define.amd ) {
        define( "jquery", [], function () { return jQuery; } );
    }

seajs如何引入jquery?

define(function(){
    //jquery源代码
    return $.noConflict();
});

测试有效果. 这表明 return 可以替代exports
这cmd 还真是都支持啊.


image.png

相关文章

  • 1.webpack笔记1-模块化,以及几种规范

    什么是模块化? 网上的什么是模块化(一)当我们在多个 JavaScript 文件之间进行通讯时,所以如何解决命名冲...

  • 关于前端模块化开发

    关于前端模块化开发 1 前端中有哪些模块化开发的规范以及实现方案 2 模块化的开发的好处 3 CommonJS

  • 模块化之CommonJs、AMD、CMD

    介绍 随着前端业务得复杂程度越来越高,模块化成了大趋势,目前有这么几种模块化得规范,AMD,CMD,CommonJ...

  • webpack之基础篇

    1.webpack简介 Webpack是⼀个打包模块化JavaScript的工具,它会从入口模块出发,识别出源码中...

  • 模块化开发

    一提到模块化开发,就会提到 CommonJS 规范和AMD规范,这些都是模块化的依据规范, RequireJS 就...

  • js模块化

    首先梳理一下模块化的发展情况~ 无模块化-->CommonJS规范-->AMD规范-->CMD规范-->ES6模块...

  • 06Vue的前端工程化

    Vue的前端工程化 一 模块化规范 1.1模块化规范举例 浏览器端JS模块化规范:AMD,CMD 服务器端JS模块...

  • Webpack基本用法(2019-03-22)

    Webpack基本用法总结(个人见解) 一、什么是Webpack 1.Webpack是进行模块化开发的工具,可以把...

  • webpack面试题合集

    1.webpack是什么? webpack是一个打包模块化javascript的工具,在webpack里一切文件皆...

  • js模块化

    js的模块化大致分为4种规范 amd cmd commonjs 和es6模块化 1.amd规范 amd规范又叫异步...

网友评论

      本文标题:1.webpack笔记1-模块化,以及几种规范

      本文链接:https://www.haomeiwen.com/subject/txzjqqtx.html