初识模块化

114 阅读3分钟

前言

随着项目不断的变大,业务越来越复杂,代码的冗余程度不断上升,于是模块化的方式逐渐流行起来.
我们坚决不能写别人看不懂的代码!!

模块化的作用

作为设计思想中的单一功能原则,模块化很好的拆解了功能模块复杂的作用,进而形成多模块组合形成大模块功能.

常用的模块化分类

1.ES Module规范(用于前端模块化)
2.Common JS规范(用于node.js的模块化)
ES Module规范的使用:
1:单个抛出/导入
            //抛出文件
            export let myName = 'test1';
 
            //导入文件
            import {myName} from './test1/js';
            
        例2:多个同时抛出/导入
            //抛出文件
            const a = 10;
            const b = 'hello';
            const c = ()=>{
                return 'abc';
            }
            export {a,b,c};
            
            //导入文件
            import {a,c} from './foo.js';
            console.log(a);//12
            console.log(c());//abc3:重命名
            //抛出文件
            const a = 10;
            const b = 'hello';
            const c = ()=>{
                return 'abc';
            }

            export {
                a as d,//重命名
                b as e,
                c as f,
            }
            
            //导入文件
            import {d,f} from './foo.js';
            console.log(d);//10
            console.log(f());//abc4:使用import * 导入整体化
            //抛出文件
            export const a = 10;
            export const b ='张三';
            
            //导入文件
            import * as foo from './ziyue.js';
            console.log(foo.a);//10
            console.log(foo.b);//张三5:通过export * 统一抛出,整体模块化
            //抛出文件
                在vue2中的util目录,作为整个项目的工具模块
                  src/core/util/lang.ts
                  src/core/util/perf.ts
                  ...
                在vue2中的util目录的src/core/utilindex.tsexport * from 'shared/util'
                  export * from './lang'
                  export * from './env'
                  export * from './options'
                  export * from './debug'
                  export * from './props'
                  export * from './error'
                  export * from './next-tick'
                  
            //引入文件
                 import { warn } from '../util/index'
                 ...
               
        例6:
            //抛出文件
            const fuc = (res)=>{
                return res
            };
            export default fuc;
            
            //引入文件
            import fuc from './fuc.js';
            
ES Module规范的注意点
  1. export 能在一个文件模块中多次使用

  2. export default 只能在一个文件模块中使用一次

CommonJS规范的使用:
        例1:module.export的单个抛出
            //抛出文件
            const fuc = ()=>{console.log('fuc')};
            module.exports = ziyue;
            
            //导入文件
            const fuc = require('./fuc');
            
        例2:module.export的多个抛出
            //抛出文件
            const a = 1;
            const b = 2;
            const c = ()=>a + b;
			
            module.exports = {
                a,b,c
            };
            
            //导入文件
            const {a,b,c} = require('./abc.js');
            console.log(a,b,c());//1 2 3
            
        例3:重命名
            //抛出文件
            const a = 1;
            const b = 2;
            const c = ()=>b-a;
			
            module.exports = {
                    d:a,
                    e:b,
                    f:c,
            }
            
            //导入文件
            const {d,e,f} = require('./abc.js');
            console.log(d,e,f());//1,2,1
            

typescript中的模块化

  1. 模块化中无法识别其他类型,所以对非ts/js文件模块进行类型扩充.并创建*.d.ts声明文件

       //global.d.ts文件下
       	declare module '*.gif' {
              export default src as string;
          }
          //将*.gif定义为string类型
          等效于
          declare module '*.gif' {
              const src:string;
              export default src;
          }
    
  2. import type和export type

    import type only imports declarations to be used for type annotations and declarations. It always gets fully erased, so there’s no remnant of it at runtime. 简而言之,import type 仅仅用于对类型的声明,当运行时,将会完全被删除

    ts的编译流程: ts经过babel编译成js.

    而在babel处理中,并不知道是否需要是类型还是值 所以通过import和import type分别定义值和类型

项目中常用的模块化思路

  •    例如在开源项目tdesign-react-starter-develop中
           src
               /assets     对应静态资源
               /components 对应公用组件
               /configs    环境配置和颜色配置
               /hooks      公用钩子函数
               /layouts    页面布局
                   /Header       头部布局
                   Footer.tsx    对应页面布局的尾部
                   Page.tsx      对应页面主内容
               /pages      页面目录
               /router     路由目录