运行和编译的概念

编译包括编译和链接两步。

编译,把源代码翻译成机器能识别的代码或者某个中间状态的语言。

比如java只有JVM识别的字节码,C#中只有CLR能识别的MSIL。还简单的作一些比如检查有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程。

链接,是把编译生成的二进制文件,组合成为一个系统可以执行的可执行文件。

运行:

把编译出来的可执行文件代码在系统中执行的过程,此时被装载到内存中

(代码保存在磁盘上没装入内存之前是个死家伙.只有跑到内存中才变成活的).

运行时类型检查就与前面讲的编译时类型检查(或者静态类型检查)不一样.不是简单的扫描代码.而是在内存中做些操作,做些判断.

模块的加载

ES6、CommonJS、AMD、CMD指的都是一种规范。

CommonJS

为在浏览器环境之外构建JavaScript生态系统而产生的项目,比如服务器和桌面环境中。

一个单独的文件就是一个模块,代码都运行在模块作用域,如果想在多个文件分享变量,必须定义为global对象的属性。(不推荐)

//模块内部,module变量代表当前模块,它的exports属性是对外的接口
//其他文件加载该模块,实际上就是读取module.exports变量。
var x = 5;
var addX = function (value) {
return value + x;
};
module.exports.x = x;
module.exports.addX = addX;
//PS:不能直接对module.exports赋值,只能给它添加方法或者属性

加载机制:

模块可多次加载,但模块的运行只在第一次加载时,运行结果被缓存了,以后再加载,就直接读取缓存结果。

通过require()同步加载依赖,导出API输出到当前模块,多个模块不能并行加载。

输入的是值的拷贝。也就是说,一旦输出一个值,模块内部的变化就影响不到这个值

应用:

服务器端的Node.js遵循CommonJS规范,Node.js主要用于服务器的编程,加载的模块文件一般都已经存在本地硬盘,所以加载起来比较快,不用考虑异步加载的方式,所以CommonJS规范比较适用。

如果是浏览器环境,要从服务器加载模块,这是就必须采用异步模式。所以就有了 AMD 、CMD 的解决方案,AMD与CMD都借鉴了CommonJs

AMD 、CMD

AMD(Asynchronous Module Definition)异步模块加载,AMD 里,require 分全局 require 和局部 require。

CMD(Common Module Definition) 通用模块加载,提供模块定义及按需执行模块。CMD 里,没有全局 require,而是根据模块系统的完备性,提供 seajs.use 来实现模块系统的加载启动

优劣:

AMD | 速度快 | 会浪费资源 | 预先加载所有的依赖,直到使用的时候才执行
CMD | 只有真正需要才加载依赖 | 性能较差 | 直到使用的时候才定义依赖

AMD:

define(['./a', './b'], function(a, b) { //运行至此,a.js和b.js文件已下载完成 a模块和b模块已执行完,直接可用;
a.doing();
// 此处省略500行代码
b.doing();
});

CMD:

define(function(require, exports, module) {
var a = require("./a"); //等待a.js下载、执行完
a.doing();
// 此处省略500行代码
var b = require("./b"); //依赖就近书写
b.doing();
});

ES6

使用export或export default导出,import导入。

import是编译时调用,所以不能使用表达式和变量,这些只有在运行时才能得到结果的语法结构。

import是解构过程,本质是输入接口,不允许在加载模块的脚本里面,改写接口。

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

import语句会执行所加载的模块,因此可以有下面的写法。

import 'lodash';

上面代码仅仅执行lodash模块,但是不输入任何值。

多次重复执行同一句import语句,那么只会执行一次。

在一个模块之中,先输入后输出同一个模块,export和import语句可以结合在一起,写成一行:

export { foo, bar } from 'my_module';

// 可以简单理解为
import { foo, bar } from 'my_module';
export { foo, bar };

注意的是,foobar实际上并没有被导入当前模块,只是相当于对外转发了这两个接口,导致当前模块不能直接使用foobar

export与export default的区别:

1.export与export default均可用于导出常量、函数、文件、模块等
2.在一个文件或模块中,export、import可以有多个,export default仅有一个
3.通过export方式导出,在导入时要加{ },export default则不需要

4.

(1)模块输出单个值,使用export default

(2) 模块输出输出多个值,使用export

(3) export default与普通的export不要同时使用

//a.js  export
export const str = "blablabla~";
export function log(sth) {
return sth;
} //b.js import
import { str, log } from 'a'; //也可以分开写两次,导入的时候带花括号 //a.js export default
const str = "blablabla~";
export default str; //b.js import
import str from 'a'; //导入的时候没有花括号 //本质上,a.js文件的export default输出一个叫做default的变量,然后系统允许你为它取任意名字。所以可以为import的模块起任何变量名,且不需要用大括号包含

import和require的区别

vue模块引入使用import,node模块引入使用require

遵循规范

  • require 是 AMD规范引入方式
  • import是es6的一个语法标准,如果要兼容浏览器的话必须转化成es5的语法(最好去看文档

加载

  • require是运行时调用在运行时确定模块的依赖关系,得到模块对象及输入/输出的变量,无法进行静态优化。所以require的是运行的结果,把结果赋值给某个变量。
    1. 通过require引入基础数据类型时,属于复制该变量。
    2. 通过require引入复杂数据类型时,数据浅拷贝该对象。
  • import是编译时调用,支持编译时静态分析,不需要的方法就不会加载,便于JS引入宏和类型检验,不能包含运行才知道结果的表达式等

写法

require / exports :

const fs = require('fs')
exports.fs = fs
module.exports = fs

import / export:

import fs from 'fs'
import {default as fs} from 'fs'
import * as fs from 'fs'
import {readFile} from 'fs'
import {readFile as read} from 'fs'
import fs, {readFile} from 'fs' export default fs
export const fs
export function readFile
export {readFile, read}
export * from 'fs'

对于模块加载:ES6、CommonJS、AMD、CMD的区别的更多相关文章

  1. commonjs amd cmd的区别

    一篇博客告诉你三者的区别:http://zccst.iteye.com/blog/2215317 告诉你三者同requirejs seajs的区别:http://blog.chinaunix.net/ ...

  2. 再唠叨JS模块化加载之CommonJS、AMD、CMD、ES6

    Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. Javascript社区做了很多努力,在现有的运行环境中,实现” ...

  3. ECMA Script 6_模块加载方案 ES6 Module 模块语法_import_export

    1. 模块加载方案 commonJS 背景: 历史上,JavaScript 一直没有模块(module)体系, 无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来. 其他语言都有这项功能: ...

  4. 【前端】CommonJS的模块加载机制

    CommonJS的模块加载机制 CommonJS模块的加载机制是,输入的是被输出的值的拷贝.也就是说,一旦输出一个值,模块内部的变化就影响不到这个值. 例如: // lib.js var counte ...

  5. javascript之模块加载方案

    前言 主要学习一下四种模块加载规范: AMD CMD CommonJS ES6 模块 历史 前端模块化开发那点历史 require.js requirejs 为全局添加了 define 函数,你只要按 ...

  6. Javascript模块化编程之CommonJS,AMD,CMD,UMD模块加载规范详解

    JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发?     模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问 题进行系 ...

  7. js模块加载之AMD和CMD

    当我写这篇文章的时候,sea.js已经逐渐退出历史的舞台,详细链接.不过任何新事物的出现都是对旧事物的取其精华,去其糟粕,所以了解一下以前模块的加载也是一件好事. js模块化的原因自不比多说,看看HU ...

  8. 构建服务端的AMD/CMD模块加载器

    本文原文地址:http://trock.lofter.com/post/117023_1208040 . 引言:  在前端开发领域,相信大家对AMD/CMD规范一定不会陌生,尤其对requireJS. ...

  9. js与AMD模块加载

    目的: 了解AMD规范与CMD规范,写一个模块加载器雏形. 基本概念: AMD是异步模块定义规范,而CMD是通用模块定义规范.其他的还有CommonJS Modules规范. 对于具体的规范,可以参考 ...

随机推荐

  1. git删除本地分支,远端分支

    br为远端分支名字. 删除local分支 git branch -d 分支名

  2. 【C++】static关键字有哪些用法?其主要作用是什么?

    static关键字的用法: 1)将全局变量修饰为静态全局变量 存储在静态存储区,整个程序运行期间一直存在 静态全局变量在声明它的文件之外是不可见的,只要声明它的文件可见,而普通的全局变量则是所有文件可 ...

  3. JS中,JSON 和 对象互转,数组和字符串的转换?

    JSON 与 J对象转化 要实现从对象转换为 JSON 字符串,使用 JSON.stringify() 方法: 如下: var json = JSON.stringify({a: 'Hello', b ...

  4. Django-10-分页组件

    1. Django内置分页 from django.shortcuts import render from django.core.paginator import Paginator, Empty ...

  5. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)

    一.Django中的缓存: 前戏: 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一 ...

  6. 简单的爬虫程序以及使用PYQT进行界面设计(包含源码解析)

    由于这个是毕业设计的内容,而且还是跨专业的.爬虫程序肯定是很简单的,就是调用Yahoo的API进行爬取图片.这篇博客主要讲的是基础的界面设计. 放上源码,然后分部解析一下重要的地方.注:flickra ...

  7. LeetCode 5274. Number of Ways to Stay in the Same Place After Some Steps - Java - DP

    题目链接:5274. 停在原地的方案数 You have a pointer at index 0 in an array of size arrLen. At each step, you can ...

  8. 向Spring 容器中注入对象的几种方法

    1.使用@Bean 注解,用于注入第三方 jar 包到SpringIOC容器中. 2.使用 @Import({Order.class, Member.class, MyImportBeanDefini ...

  9. 女性对DeepNude脱衣技术的防护

    写在前面的话 本文不提供下载方式,开源部分只是社区逆向后公开的部分源码 这篇文章有些人看了可能会比较极端,但不从技术角度分析又谈何防护?攻与防一直存在,不管是安全还是AI都是一样 你极端不极端,它就在 ...

  10. 全栈项目|小书架|服务器端-NodeJS+Koa2 实现点赞功能

    效果图 接口分析 通过上面的效果图可以看出,点赞入口主要是在书籍的详情页面. 而书籍详情页面,有以下几个功能是和点赞有关的: 获取点赞状态 点赞 取消点赞 所以项目中理论上与点赞相关的接口就以上三个. ...