03 - 模块化

作者: Elvmx | 来源:发表于2019-01-14 23:49 被阅读280次

思考下面的代码

image.png
  • 变量污染,命令冲突经常发生。
  • 代码复用性不高。
  • 代码可维护性不高。
  • 依赖关系管理不方便。

模块化开发思想

什么是模块化开发思想:

一个模块就是一个实现特定功能的文件,有了模块我们就可以更方便的使用别人的代码,要用什么功能就加载什么模块。

模块化开发带来的好处:

  • 避免变量污染,命令冲突
  • 提高代码复用率
  • 提供代码可维护性
  • 依赖关系的管理更方便

前端模块化的实现过程


NodeJS 中的模块化实现是基于 CommonJS规范

规范与实现是一个相互促进的关系:

image.png

CommonJS规范

1. 一个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类都是私有的,对其他文件不可见。不会污染全局作用域。

// test1.js
var x = 5;
var addX = function (value) {
    return value + x;
};

// test2.js
var test1 = require('./test1');

console.log(test1);

2. 每个模块内部,==module==变量代表当前模块。这个变量是一个对象,他的==exports属性==(即==module.exports==)是对外的接口。加载(require)某个模块,其实就是加载该模块的==module.exports==属性。

// test3.js
var x = 5;
var addX = function (value) {
    return value + x;
}

module.exports.x = x;
module.exports.addX = addX;

// test4.js
var test1 = require('./test1.js');

console.log(test1);  // { x: 5, addX: [Function: addX] }
console.log(test1.x); // 5
console.log(test1.addX(1)); // 6

3. 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。

// test5.js
console.log('加载 test5 咯');
module.exports.x = 5;

// test6.js
var test5 = require('./test5.js');
console.log(test5.x);

var test5 = require('./test5.js');
console.log('end');

4. 模块加载的顺序,按照其在代码中出现的顺序。

// test7.js
console.log('加载 test7 咯');
module.exports.x = 7;

// test8.js
console.log('加载 test8 咯');
module.exports.x = 8;

// test9.js
var test7 = require('./test7.js');
var test8 = require('./test8.js');

5. 模块还提供有一个==exports==变量,指向==module.exports==。这等于在每个模块头部,有一行隐藏的如下代码:

var exports = module.exports;

于是我们我们在对外暴露接口时,可以直接通过 exports 来添加属性或方法。

// test10.js
var x = 5;
var addX = function (value) {
    return value + x;
};
exports.x = x;
exports.addX = addX;

// test11.js
var test10 = require('./test10.js');
console.log(test10.x);
console.log(test10.addX(1));

PS:

  • 不能直接将==exports==变量指向一个值,因为这样等于切断了==exports==与==module.exports==的联系。

6. require

==require== 函数的基本功能是,读入并执行一个模块文件,然后返回该模块的 ==module.exports== 对象。如果没有发现指定的模块,会报错。

require 加载规则:

  1. 后缀名默认为 ==.js===。所以 require 的时候可以省略 .js 的后缀。
var foo = require('./foo');
// 等价于
var foo = require('./foo.js');
  1. 核心模块或安装的第三方模块,直接写模块名称即可。
var http = require('http'); // http 是核心模块
var jquery = require('jquery'); // jquery 是通过npm安装的第三方模块
  1. 加载项目中手动写的模块的话,需要使用 相对路径或绝对路径


    image.png

相关文章

  • 新能源模块化汽车,时速可以达120公里

    新能源模块化汽车,时速可以达120公里 [ 洞观世界2020-05-01 03:41](https://touti...

  • 03 - 模块化

    思考下面的代码 变量污染,命令冲突经常发生。 代码复用性不高。 代码可维护性不高。 依赖关系管理不方便。 模块化开...

  • ES6学习笔记 II

    模块化 注意:模块化需要放到服务器环境使用模块化: 定义模块化如下 export export const a =...

  • 前端开发——模块化(css模块化开发)

    掌握模块化开发的思想是我们进行模块化开发的基础。他有以下几部分组成: 模块化开发的优势 css模块化 css模块化...

  • Node.js模块化学习

    模块化的基本概念Node.js 中模块化npm与包模块的加载机制 模块化的基本概念 什么是模块化 模块化是指解决一...

  • webpack基础笔记

    webpack基础 1.前端工程化 实际的前端开发: 模块化:(js的模块化,css的模块化,资源的模块化) 组件...

  • 模块化开发

    js模块化开发vue模块化开发

  • Vue前端工程化

    1.模块化的分类 A.浏览器端的模块化 B.服务器端的模块化 C.ES6模块化 小结:推荐使用ES6模块化,因为A...

  • 前端工程化

    1.模块化的分类 A.浏览器端的模块化 B.服务器端的模块化 C.ES6模块化 小结:推荐使用ES6模块化,因为A...

  • vue5

    es6新内容 class 解构赋值 扩展对象 模块化 什么是模块化 模块的作用 怎么实现模块化 模块化的标准 Co...

网友评论

    本文标题:03 - 模块化

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