前端开发离不开模块化,与模块化有关的关键字有以下几个:

  • require/module.exports

  • export/import

  • define/require/exprots

  • define/seajs.use

这涉及到4种模块化规范:AMD、CMD、CommonJS、ES6。

AngularJS

AngularJS模块化使用的并不是标准的AMD规范,AngularJS的风格风格大致是这样的:

不仅模块的定义和引入麻烦,与Html标签耦合也较严重,阅读吃力,扩展与复用麻烦。AngularJS的模块化风格还停留在代码层面。

后来出现了AMD规范。

AMD

AMD规范使用统一的define、require做为伪关键字。模块化定义是这样的:

// a.jsdefine(["b", "require", "exports"], function(b, require, exports) {console.log("a.js执行");console.log(b);// 暴露api可以使用exports、module.exports、return    exports.a = function() {return require("b");    }})// b.jsdefine(function() {console.log('b.js执行');console.log(require);console.log(exports);console.log(module);return 'b';})

引用是这样的:

// index.jsrequire(['a', 'b'], function(a, b) {console.log('index.js执行');})

define与require虽然不是语法关键字,但已经在努力让自己看起来是关键字了,它们依赖于requireJS才能工作。AMD规范仍然是在代码层面折腾。

再后来出现了CMD规范。

CMD

CMD(Common Module Definition)表示通用模块定义,该规范是国内发展出来的,由阿里的玉伯提出。就像AMD有个requireJS,CMD有个浏览器的实现SeaJS。

定义模块:

// mymodule.jsdefine(function(require, exports, module) {var $ = require('jquery.js')  $('div').addClass('active');});

加载模块:

// 加载与使用模块seajs.use(['mymodule.js'], function(my){});

无论是AMD、还是CMD都是在文件内的代码层面折腾。后来出现了CommonJS,从CommonJS开始,默认一个文件是一个模块。

CommonJS

定义模块:

// foo.jsfunction foo(){    lib.log('hello world!');}

// 导出给其它模块module.exports.foo = foo;

使用模块:

const foo = require('foo');

CommonJS规范已经相当完善了。微信小程序、小游戏默认推荐的模块化规范即是CommonJS。

模块的动态加载与静态加载

使用CommonJS,可以在运行时动态加载模块:

if (condition) {let my = require('./mymodual')}

但是动态加载不便于引擎静态分析,不能在开发阶段就确认程序的依赖关系。此外,像这样的引入:

let { stat, exists, readFile } = require('fs');

这是整体引入了fs,然后分别赋值给了三个变量。等价于:

let _fs = require('fs');let stat = _fs.stat;let exists = _fs.exists;let readfile = _fs.readfile;

为了实现按需引入及在开发阶段尽早确认类库的依赖关系,尽量减少运行时异常。ES6模块规范应运而生。

ES2015(ES6)

2015年6月,ES2015正式发布,即ES6。

声明模块:

export function area(radius) {  return Math.PI * radius * radius;}

引用与使用模块:

import {area} from './circle'console.log('圆面积:' + area(10))

如果想在引入时不使用析造语法,声明模块时可以使用default关键字:

export default function area(radius) {  return Math.PI * radius * radius;}

引用就这样了,不再需要花括号:

import area from './circle'

统一的导出格式

一个类库,有没有可能同时遵从多个模块化规范,支持多种方式的导入?

答案是可以的:

;(function (name, definition) {// 检测上下文环境是否为AMD或CMDvar hasDefine = typeof define === 'function',// 检查上下文环境是否为Node      hasExports = typeof module !== 'undefined' && module.exports;

if (hasDefine) {// AMD环境或CMD环境    define(definition);  } else if (hasExports) {// 定义为普通Node模块,使用CommonJS规范导出module.exports = definition();  } else {// 将模块的执行结果挂在window变量中,在浏览器中this指向window对象// 使用script标签在html中引入this[name] = definition();  }})('hello', function () {// 真正的模块代码放在这里  'use strict';/*eslint-disable */var hello = function () {};return hello;});

这里导出方式,不但支持以上4种模块化方案,还支持传统的script标签引入。当以script标签在html页面中引入时,访问window.xxx可以调取类库。例如上面的示例,直接以script引入,可以访问window.hello。

use strict是开启严格模式。开启后,对代码有如下约束:

  • 变量必须声明后再使用

  • 函数的参数不能有同名属性,否则报错

  • 不能使用with语句

  • 不能对只读属性赋值,否则报错

  • 不能使用前缀 0 表示八进制数,否则报错

  • 不能删除不可删除的属性,否则报错

  • 不能删除变量delete prop,会报错,只能删除属性delete global[prop]

  • eval不会在它的外层作用域引入变量

  • eval和arguments不能被重新赋值

  • arguments不会自动反映函数参数的变化

  • 不能使用arguments.callee

  • 不能使用arguments.caller

  • 禁止this指向全局对象

  • 不能使用fn.caller和fn.arguments获取函数调用的堆栈

  • 增加了保留字(比如protected、static和interface)


2019年5月10日 石桥码农

中引入文件报错_关于前端开发中的模块化相关推荐

  1. ieda ts文件报错_使用TS开发微信小程序(1):环境搭建——VSCode+TS

    前言 现在接到小程序需要改版的需求,由于使用Ionic的经验,希望以后能够统一开发语言降低开发成本,所以想使用TypeScript进行开发. 开发前准备工作 先是看官网,在微信小程序的官方开发文档中找 ...

  2. mysql表中插中文报错_向mysql表中插入含有中文的数据时报错:[Err] 1366

    创建的表及插入语句如下: create table students (name varchar(25), class varchar(25), grade int); insert into stu ...

  3. 引入文件报错的解决方法(bootstrap+jquery项目)

    这篇文章主要介绍了bootstrap+jquery项目引入文件的常见报错问题,下面给大家分享了一些错误及错误的解决方法,需要的朋友可以参考下 做一个项目的时候 ,控制台总是会出现各种bug,其实不用慌 ...

  4. vite:vue中引入图片报错require is not defined

    问题 在 vite 项目中这样引入图片报错 images: require('../assets/images/right.png') 改为 images: new URL('../assets/im ...

  5. python调用js文件报错_python - selenium 运行网页中js脚本报错,提示未定义

    问 题 问题1 selenium 运行网易中js脚本报错提示未定义 报错提示如下: driver.execute_script("javascript:amsInit(62800,30315 ...

  6. Android Studio中R文件报错的解决方案

    1.说明 平时呢,我们运行项目的时候.会不小心就出现R文件变红的情况,尽管我们是无心的,但是这种问题太烦恼了,有时处理不好整项目都无法运行,确实给像我这样菜鸟带来了很大的烦恼;这里我提供一种解决方案, ...

  7. python执行js文件报错_使用PyV8在Python爬虫中执行js代码

    前言 可能很多人会觉得这是一个奇葩的需求,爬虫去好好的爬数据不就行了,解析js干嘛?吃饱了撑的? 搜索一下互联网上关于这个问题还真不少,但是大多数童鞋是因为自己的js基础太烂,要么是HTML基础烂,要 ...

  8. vue中引入jquery报错问题

    vue-cli搭建的vue项目中使用到jquery插件,需要引入jquery, 在无任何配置的情况下,直接在组件中import引入,在mounted时候打印$ 会显示undefined报错问题, 感觉 ...

  9. SpringBoot中yml文件报错:org.yaml.snakeyaml.scanner.ScannerException:mapping values are not allowe here...

    场景 SpringBoot中配置静态资源访问路径时提示: 报错代码如下: 实现 首先确保yml文件的格式要正确,每个冒号的后面要紧跟空格. 根据提示报错信息在static-path-pattern这个 ...

最新文章

  1. android中getMeasuredHeigh()为0的问题
  2. 深入浅出的“深拷贝与浅拷贝”
  3. Linux-grep 命令和find 命令 (6)
  4. The 15th UESTC Programming Contest Preliminary C - C0ins cdoj1554
  5. 最简单的dockerfile使用教程 - 创建一个支持SSL的Nginx镜像
  6. JAVA 实现FTP功能_Java实现FTP上传下载功能
  7. greendao删除其中一条_广东东莞将迎来一条新地铁,全长58公里,设24站,沿途市民有福了...
  8. python怎么调用接口失败_python 调用接口
  9. 3D游戏编程——游戏的本质
  10. 结构光三维重建阶段性总结
  11. win7 计算机不显示u盘启动不了,Win7系统下bios中找不到U盘启动项如何解决
  12. 图扑数字孪生北京故宫,推进旅游业元宇宙进程
  13. 南大通用GBase XDM支持的操作平台
  14. Neo4j的安装与配置
  15. FFmpeg提取视频音乐
  16. CSM(Certified Scrum Master) 敏捷认证是什么?
  17. 全国22家奶粉企业69批次产品检出三聚氰胺
  18. 微信小程序之自定义组件的使用、介绍、案例分享
  19. java验证码生成,含数字和英文字母
  20. python读取水印_阿里水印的Python实现

热门文章

  1. Redis实战(二):Redis 的 String 类型 bitmap
  2. 【Jmeter】压力测试工具 Jmeter 使用
  3. 【WebPack】引入Vue;认识Plugin;使用uglifyjs丑化JS代码;搭建本地服务器;生产开发环境配置文件的抽离
  4. 【SQL】查询DateTime类型的某一年数据
  5. 【Modelsim入门】新建项目,添加verilog文件,经编译的程序进行仿真
  6. 汇编语言 明明定义了栈仍然no stack segment 以及栈空间数据被篡改问题
  7. width用计算机英语,计算机的英语词汇
  8. Intellij 14快捷键
  9. 安卓学习 之 多媒体技术(八)
  10. vue_axios详解