中引入文件报错_关于前端开发中的模块化
前端开发离不开模块化,与模块化有关的关键字有以下几个:
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日 石桥码农
中引入文件报错_关于前端开发中的模块化相关推荐
- ieda ts文件报错_使用TS开发微信小程序(1):环境搭建——VSCode+TS
前言 现在接到小程序需要改版的需求,由于使用Ionic的经验,希望以后能够统一开发语言降低开发成本,所以想使用TypeScript进行开发. 开发前准备工作 先是看官网,在微信小程序的官方开发文档中找 ...
- mysql表中插中文报错_向mysql表中插入含有中文的数据时报错:[Err] 1366
创建的表及插入语句如下: create table students (name varchar(25), class varchar(25), grade int); insert into stu ...
- 引入文件报错的解决方法(bootstrap+jquery项目)
这篇文章主要介绍了bootstrap+jquery项目引入文件的常见报错问题,下面给大家分享了一些错误及错误的解决方法,需要的朋友可以参考下 做一个项目的时候 ,控制台总是会出现各种bug,其实不用慌 ...
- vite:vue中引入图片报错require is not defined
问题 在 vite 项目中这样引入图片报错 images: require('../assets/images/right.png') 改为 images: new URL('../assets/im ...
- python调用js文件报错_python - selenium 运行网页中js脚本报错,提示未定义
问 题 问题1 selenium 运行网易中js脚本报错提示未定义 报错提示如下: driver.execute_script("javascript:amsInit(62800,30315 ...
- Android Studio中R文件报错的解决方案
1.说明 平时呢,我们运行项目的时候.会不小心就出现R文件变红的情况,尽管我们是无心的,但是这种问题太烦恼了,有时处理不好整项目都无法运行,确实给像我这样菜鸟带来了很大的烦恼;这里我提供一种解决方案, ...
- python执行js文件报错_使用PyV8在Python爬虫中执行js代码
前言 可能很多人会觉得这是一个奇葩的需求,爬虫去好好的爬数据不就行了,解析js干嘛?吃饱了撑的? 搜索一下互联网上关于这个问题还真不少,但是大多数童鞋是因为自己的js基础太烂,要么是HTML基础烂,要 ...
- vue中引入jquery报错问题
vue-cli搭建的vue项目中使用到jquery插件,需要引入jquery, 在无任何配置的情况下,直接在组件中import引入,在mounted时候打印$ 会显示undefined报错问题, 感觉 ...
- SpringBoot中yml文件报错:org.yaml.snakeyaml.scanner.ScannerException:mapping values are not allowe here...
场景 SpringBoot中配置静态资源访问路径时提示: 报错代码如下: 实现 首先确保yml文件的格式要正确,每个冒号的后面要紧跟空格. 根据提示报错信息在static-path-pattern这个 ...
最新文章
- android中getMeasuredHeigh()为0的问题
- 深入浅出的“深拷贝与浅拷贝”
- Linux-grep 命令和find 命令 (6)
- The 15th UESTC Programming Contest Preliminary C - C0ins cdoj1554
- 最简单的dockerfile使用教程 - 创建一个支持SSL的Nginx镜像
- JAVA 实现FTP功能_Java实现FTP上传下载功能
- greendao删除其中一条_广东东莞将迎来一条新地铁,全长58公里,设24站,沿途市民有福了...
- python怎么调用接口失败_python 调用接口
- 3D游戏编程——游戏的本质
- 结构光三维重建阶段性总结
- win7 计算机不显示u盘启动不了,Win7系统下bios中找不到U盘启动项如何解决
- 图扑数字孪生北京故宫,推进旅游业元宇宙进程
- 南大通用GBase XDM支持的操作平台
- Neo4j的安装与配置
- FFmpeg提取视频音乐
- CSM(Certified Scrum Master) 敏捷认证是什么?
- 全国22家奶粉企业69批次产品检出三聚氰胺
- 微信小程序之自定义组件的使用、介绍、案例分享
- java验证码生成,含数字和英文字母
- python读取水印_阿里水印的Python实现
热门文章
- Redis实战(二):Redis 的 String 类型 bitmap
- 【Jmeter】压力测试工具 Jmeter 使用
- 【WebPack】引入Vue;认识Plugin;使用uglifyjs丑化JS代码;搭建本地服务器;生产开发环境配置文件的抽离
- 【SQL】查询DateTime类型的某一年数据
- 【Modelsim入门】新建项目,添加verilog文件,经编译的程序进行仿真
- 汇编语言 明明定义了栈仍然no stack segment 以及栈空间数据被篡改问题
- width用计算机英语,计算机的英语词汇
- Intellij 14快捷键
- 安卓学习 之 多媒体技术(八)
- vue_axios详解