7986LiChang / MyLearnDemos

前端学习路上实现过的一些demo,近期在集中整理基础知识
MIT License
0 stars 0 forks source link

模块化编程 Nodejs中CommonJS / require.js / sea.js #2

Open 7986LiChang opened 7 years ago

7986LiChang commented 7 years ago

1. CommonJS/AMD/CMD

node 编程中最重要的思想是模块化。而在node模块中,采用CommonJS规范,使用module.exports导出接口,使用require引入模块。 在服务器端,node的module遵循CommonJS规范 在浏览器端,出现require.js/sea.js工具包。requirejs遵循AMD,seajs遵循CMD。 虽然有不同,但还是希望能保持比较统一的代码风格。

// a.js

// -------- node -----------
module.exports = {
  a : function() {},
  b : 'xxx'
};

// ----------- AMD or CMD ----------------
define(function(require, exports, module){
  module.exports = {
    a : function() {},
    b : 'xxx'
  };
});

// b.js

// ------------ node ---------
var m = require('./a');
m.a();

// ------------ AMD or CMD -------------
define(function(require, exports, module){
   var m = require('./a');
   m.a();
});

2. ES6中的module

ES6发布的module没有直接采用CommonJS,甚至没有采用require。 因此,require仍然是node的一个私有全局方法,module.exports是node私有的全局变量属性

3. 模块化编程 require.js库

在html中可以引入多个js文件,并按照顺序依次加载。因此,可以在a.js文件中引用b.js文件中的变量,但前提时:b.js先与a.js加载,保证b加载完成后其中变量才可使用。 例如:

  <script src="1.js"></script>
  <script src="2.js"></script>
  <script src="3.js"></script>
  <script src="4.js"></script>
  <script src="5.js"></script>
  <script src="6.js"></script>

这段代码将依次加载多个js文件。但是,这种写法在js文件较少时还能使用,一旦js文件过多,就会出现这样的问题:

因此,require.js诞生就是为了解决上述问题:

7986LiChang commented 7 years ago

4. 关于在浏览器页面中使用require,module报错的情况

原因: npm的模块都是javascript写的,但浏览器用不了,因为在浏览器端不支持CommonJS格式,只在服务器端基于Node使用CommonJS

浏览器不兼容CommonJS的根本原因在于:缺少四个Node.js环境的变量:

(function(module, exports) { exports.multiply = function (n) { return n * 1000 }; }(module, module.exports))

var f = module.exports.multiply; f(5) // 5000


- browserify 是目前最常用的CommonJS格式转换工具,但不能在浏览器中操作