文章参考:https://juejin.im/post/5aaa37c8f265da23945f365c#heading-3

模块化的开发方式可以提高代码的复用率,方便进行代码的管理。
通常一个文件就是一个模块,有自己的作用域,只向外暴露特定的变量和函数。
目前有 CommonJS AMD CMD 以及 ES6的 模块系统。

CommonJS

主要体现在nodejs.他有四个重要的环境变量为模块化的实现提供支持, module exports require global

  1. //导入
  2. const moduleA = require('./moduleA')
  3. //导出
  4. module.exports = moduleA.someFunc

优点:

  • 代码可复用于Nodejs环境下并运行,例如做同构应用
  • 通过NPM发布的很多第三方模块都采用了CommonJS规范

缺点:

  • 无法直接运行在浏览器环境下,必须通过工具转换成标准的 ES5

示例:

  1. math.js
  2. // 定义模块math.js
  3. var basicNum = 0
  4. function add(a,b){
  5. return a+b
  6. }
  7. module.exports = { //在这里写上需要向外暴露的函数、变量
  8. add:add,
  9. basicNum:basicNum
  10. }
  11. index.js
  12. // 引用自定义的模块时,参数包含路径,可省略.js
  13. var math = require('./math')
  14. console.log(math.add(2,5))
  15. -----------------------------------------------------
  16. // 引用核心模块时,不需要带路径
  17. var http = require('http');
  18. http.createService(...).listen(3000);

ES6 Module

文章链接

其 模块功能主要由两个命令构成 export 和 import

  1. //导入
  2. import {readFile} from 'fs'
  3. import react from 'react'
  4. //导出
  5. export function hello(){}
  6. export default { //... }

export 命令用于规定模块的对外接口,import 命令用于输入其他模块提供的功能

  1. /** 定义模块 math.js **/
  2. var basicNum = 0;
  3. var add = function (a, b) {
  4. return a + b;
  5. };
  6. export { basicNum, add };
  7. /** 引用模块 **/
  8. import { basicNum, add } from './math';
  9. function test(ele) {
  10. ele.textContent = add(99 + basicNum);
  11. }

export default 为模块指定默认输出 对应的 import 语句不需要使用大括号

  1. /** export default **/
  2. //定义输出
  3. export default { basicNum, add };
  4. //引入
  5. import math from './math';
  6. function test(ele) {
  7. ele.textContent = math.add(99 + math.basicNum);
  8. }

export 命令

export 命令规定的是对外的接口,必须与模块内部的变量建议一一对应关系

  • 输出变量

第一种

  1. export var name = "chu"

第二种:优先考虑这种写法,因为可以很直观的看到输出了哪些变量

  1. var name = "chu"
  2. export {name}
  • 输出函数或类

第一种:

  1. export function multiply(x,y){
  2. return x * y
  3. }

第二种

  1. as 关键字是重命名了 函数v1 的对外接口
  2. function v1(){}
  3. export { v1 as streamV1 } //这段是 将v1重新命名为streamV1 。导入的时候名称为streamV1

import 命令

语法规则

  1. import ... from ...
  2. 1.from后面指定模块文件的位置,可以是相对路劲也可以是绝对路径
  3. 2. .js 后缀名可以省略

import 命令加载这个模块,需要注意大括号里面的变量名称,必须与被导入模块对外接口的名称相同

  1. // main.js
  2. import { firstName, lastName, year } from './profile.js';
  3. function setName(element) {
  4. element.textContent = firstName + ' ' + lastName;
  5. }

如果想为输入的变量重新取一个名字 import 命令需要使用 as 关键字。

  1. import { lastName as surname } from './profile.js' //surname 为最终名称

建议:
import 命令输入的变量都是只读的,因为它的本质是输入接口。
(这样不好)当导入的是一个对象的时候,我们可以改写对象的属性。
推荐在 import 导入接口的时候不要去修改其值。

import命令具有提升效果,会提升到整个模块的头部,首先执行。

  1. 不会报错
  2. foo();
  3. import { foo } from 'my_module';

模块的整体加载

  1. export function a(){
  2. }
  3. export function b(){
  4. }
  5. 1.逐一加载的方法
  6. import {a,b} from './test'
  7. 2.整体加载的方法
  8. import * as test from './test'

备注:整体加载的方法,当文件不是默认导出方法的时候可用

  1. //module1.js
  2. export function foo(){
  3. console.log('foo')
  4. }
  5. export function bar(){
  6. console.log('bar')
  7. }
  8. //home.vue
  9. import * as module1 from '@/utils/module1'
  10. 上面的方法也可以写
  11. // module1.js
  12. function a(){}
  13. export { a }

image.png


export default 命令

export default 命令输出的是一个叫做 default 的变量,所以后面不可以跟变量声明的语句

基本使用
import 命令可以为该匿名函数指定任意名字

  1. //导出一个对象
  2. export default {
  3. name:"doraemon"
  4. }
  5. //导出函数
  6. export default function(){
  7. console.log("default")
  8. }
  9. import a from './test'

比较

  1. // 第一组
  2. export default function crc32() { // 输出
  3. // ...
  4. }
  5. import crc32 from 'crc32'; // 输入
  6. // 第二组
  7. export function crc32() { // 输出
  8. // ...
  9. };
  10. import {crc32} from 'crc32'; // 输入

输出类

  1. // MyClass.js
  2. export default class { ... }
  3. // main.js
  4. import MyClass from 'MyClass';
  5. let o = new MyClass();

样式文件中的模块化

  1. // util.scss 文件
  2. // 定义样式片段
  3. @mixin center {
  4. // 水平竖直居中
  5. position: absolute;
  6. left: 50%;
  7. top: 50%;
  8. transform: translate(-50%,-50%);
  9. }
  10. // main.scss 文件
  11. // 导入和使用 util.scss 中定义的样式片段
  12. @import "util";
  13. #box{
  14. @include center;
  15. }