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

"Hello World, Hello Blog"

Posted by wudimingwo on December 15, 2018

image.png

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

1
2
3
4
5
6
7
8
9
// 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
> 据此得出结论:一旦输出一个值,模块内部的变化就影响不到这个值。
> 这个结论是有问题的. 之所以影响不到是因为 counter 是个原始值.
> 如果改成 counter.num++ counter变成引用值,则还是有效果的. 
> (吓我一跳,如果影响不到,那各种变量岂不是都用不了?)

> [什么是模块化,模块化开发如何实现?](https://blog.csdn.net/a_one2010/article/details/54563733);
> 模块化就是讲js文件按照功能分离,根据需求引入不同的文件中。源于服务器端。

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

![image.png](https://upload-images.jianshu.io/upload_images/13637909-30cccb073f9c9876.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image.png](https://upload-images.jianshu.io/upload_images/13637909-696f3f803d4e6676.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image.png](https://upload-images.jianshu.io/upload_images/13637909-132b077148cc58bb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
> common.js

#main.js

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

1
#m1.js

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

1
#m2.js

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

1
#m3.js

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

1
2
3
4
5
6
7
用git  执行 node main.js
![image.png](https://upload-images.jianshu.io/upload_images/13637909-7c006a38bb8e6173.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image.png](https://upload-images.jianshu.io/upload_images/13637909-486f19542fceae2e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image.png](https://upload-images.jianshu.io/upload_images/13637909-ec87d5d9bbc82052.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image.png](https://upload-images.jianshu.io/upload_images/13637909-3bd483cb4a5b9297.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
我让main.js 依赖 m3, m3 依赖 m2 和 m1
index.html 注意要用 data-main 指定主要的js文件.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
     <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"});
})

})();

1
test/m1.js

define(function () { var num = 1;

1
2
3
return {
  num:num
} })
1
m2.js

define(function () { var num = 2;

1
2
3
4
5
6
7
8
return {
  num : num
} }) ``` m3.js ``` define(["m1","m2"],function (num1,num2) {
var num = num1.num + num2.num;

return {
  num : num
} })
1
2
3
4
![image.png](https://upload-images.jianshu.io/upload_images/13637909-fc36d612821c809b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image.png](https://upload-images.jianshu.io/upload_images/13637909-6e932fedfde85463.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
cmd 
index.html
1
2
3
4
5
6
7
8
    <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; })
1
m2.js

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

exports.num = num; })

1
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 }

})

1
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 }) })

})();

1
2
3
4
![image.png](https://upload-images.jianshu.io/upload_images/13637909-8cc125273cd0756b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
执行顺序就不说了,先执行同步的主线程的,然后再执行事件里的.
这里发现jq无法引入, 表明 jq 是不支持sea.js的. 呵呵,看来用的人是不是不多啊?
jq源码是支持 amd的
1
2
3
4
5
if ( typeof define === "function" && define.amd ) {
	define( "jquery", [], function () { return jQuery; } );
} ``` [seajs如何引入jquery?](https://blog.csdn.net/vtegong/article/details/54925824) ``` define(function(){
//jquery源代码
return $.noConflict(); }); ``` 测试有效果. 这表明 return 可以替代exports  这cmd 还真是都支持啊. ![image.png](https://upload-images.jianshu.io/upload_images/13637909-594d691e037cfa72.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)