模块化

作者: hualayou | 来源:发表于2020-10-22 14:51 被阅读0次

前端开发的发展

近年来 Web 应用变得更加复杂与庞大, Web 前端技术的应用范围也更加广泛。从复杂、庞大的管理后台,到对性能要求苛刻的移动网页,再到类似于 ReactNative 的原生应用开发方案, Web 前端工程师在面临更多机遇的同时也面临更大的挑战 通过直接编写 JavaScript cssHTML 开发 Web 应用的方式己经无法应对当前 Web 应用的发展 近年来,前端社区涌现出多新思想与框架,下面将一一介绍它们。

模块化

模块化是指将一个复杂的系统分解为多个模块以方便编码。

很久以前,开发网页通过命名空间的方式来组织代码,例如jQuery库将他的API都放在了window.$下,在加载完jQuery后,其他模块再通过window.$去使用jQuery。这样有很多问题,其中包括:

1.命名空间冲突,两个库可能会使用同一个名称,例如Zepto(http://zeptojs.com)也被放在window.$下;

2.无法合理地管理项目的依赖和版本;

3.无法方便的控制依赖的加载顺序。

当项目变大时,这种方式将变得难以维护,需要使用模块化的思想来组织代码。

1.CommonJS

CommonJS ( http: //www.commonjs.org )是一种被广泛使用的 JavaScript 模块化规范,其核心思想是通过 require 方法来同步加载依赖的其他模块,通过 module.exports 出需要暴露的接口。 CommonJS 规范的流行得益于 Node.js 采用了这种方式,后来这种方式被引入 到了网页开发中

采用CommonJS导入及导出的代码如下:

// 导入

const moduleA = reqiuire('./moduleA');

// 导出

module.exports = moduleA.someFunc;

CommonJS的优点在于:

1.代码可复用于Node.js环境下运行,例如做同构应用;

2.通过Npm发布的很多第三方模块都采用了CommonJS规范

CommonJS的缺点在于:

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

另外说明:

CommonJS 还可以细分为 CommonJSl CommonJS2 ,区别在于 CommonJSl 只能通过exports . XX = XX 的方式导出,而 CommonJS2 CommonJSl 基础上加入了 module.exports = XX 的导出方式。 CommonJS 通常指 CommonJS2。

2.AMD

AMD ( https://en.wikipedia.org/wiki/ Asynchronous_ module_ definition )也是 JavaScript模块化规范,与 CommonJS 最大的不同在于,它采用了异步的方式去加载依赖的模块。 AMD规范主要用于解决针对浏览器环境的模块化问题,最具代表性的实现是 requirejs (http:// requirejs. org )。

采用AMD导入及导出的代码如下:

// 定义一个模块

define('module',['dep'],function(dep){

    return exports;

});

// 导入和使用

require(['module'],function(){

});

AMD的优点在于:

1.可以在不转换代码的情况下直接在浏览器中运行。

2.可异步加载依赖。

3.代码可运行在浏览器和Node.js环境下。

AMD的缺点在于:

JavaScript运行环境没有原生支持AMD,需要先导入实现了AMD的库后才能正常使用。

3.ES6模块

ES6 模块化是国际标准化组织 ECMA 提出的 JavaScript 模块化规范,它在语言层面上实现了模块化。浏览器厂商和 Node 都宣布要原生支持该规范 它将逐渐取代 CommonJSAMD 规范,成为浏览器和服务器通用的模块解决方案。

采用ES6模块化导入及导出的代码如下:

// 导入

import { readFile } from 'fs';

import React from 'react';

// 导出

export function hello(){};

export default{

    // ...

};

另外说明:

ES6模块虽然是终极模块化方案,但它的缺点在于目前无法直接运行在大部分JavaScript运行环境下,必须通过工具转换成标准的ES5后才能正常运行。

4.样式文件中的模块化

除了JavaScript开始进行模块改造,前端开发里的样式文件也支持模块化。以SCSS为例,将一些常用的样式片段放进了一个通用的文件里,再在另一个文件里通过@import语句导入和使用这些样式片段:

// util.scss文件

// 定义样式片段

@mixin center{

    // 水平竖直居中

    position: absolute;

    top: 50%;

    left: 50%;

    transform: translate(-50%,-50%);

}

// main.scss文件

// 导入和使用util.scss中定义的样式片段

@import "util";

#box{

    @include center;

}

Webpack

Webpack(https//webpack.js.org)是一个打包模块化JavaScript的工具,在Webpack里一切文件接模块,通过Loader转换文件,通过Plugin注入钩子,最后输出由多个模块组合成的文件。Webpack专注于构建模块化项目

一切文件如JavaScript、CSS、SCSS、图片、模块,对于Webpack来说都是一个个模块,这样的好处能清晰的描述各个模块之间的依赖关系,以方便Webpack对模块化进行组合和打包。经过Webpack的处理,最终会输出浏览器能使用的静态资源。

Webpack 具有很大的灵活性,能配置处理文件的方式,使用方法大致如下:

module.exports = {

        // 所有模块的入口,webpack从入口开始递归解析出所有依赖的模块

        entry: './app.js',

        output: {

      // 将入口所依赖的所有模块打包成一个文件bundle.js输出

            filename: 'bundle.js'

    }

}

相关文章

  • 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...

  • Vue基础教程之-组件核心概念(四)

    一、模块化 1.1 为什么需要模块化 没有模块化的世界:全局变量污染、难以管理的依赖。常见的模块化标准:Commo...

  • vue项目基建

    路由模块化 , 高频全局组件模块化 权限

网友评论

      本文标题:模块化

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