博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Module
阅读量:5052 次
发布时间:2019-06-12

本文共 2924 字,大约阅读时间需要 9 分钟。

模块功能主要由两个命令构成:export和import。export命令用于暴露模块的对外接口,import命令用于引入其他模块提供的接口。

export命令

一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。要想外部能够读取该模块内的变量,必须使用export关键字输出该变量。如下代码:

// profile.jsexport var firstName = 'Michael';export var lastName = 'Jackson';export var year = 1958;

也可以采用下面的写法:

// profile.jsvar firstName = 'Michael';var lastName = 'Jackson';var year = 1958;export {firstName, lastName, year};

export除了输出变量还可以输出函数或类(Class)。

export function multiply (x, y) {    return x * y;}

注意:export命令规定的是对外接口,必须与模块内部的变量建立一一对应的关系。也就是说export的对象可以使变量,函数或类,但不能是值。

// 报错export 1;// 报错var m = 1;export m;

正确的写法如下:

// 写法一export var m = 1;// 写法二var m = 1;export {m};

import命令

export暴露接口,其他JS文件可以使用import命令加载该模块,引入这个接口。

// profile.jsexport var firstName = 'Michael';export var lastName = 'Jackson';export var year = 1958;
// main.jsimport {firstName, lastName, year} from './profile';function setName(element) {  element.textContent = firstName + ' ' + lastName;}

上面的import命令用于加载profile.js,import后面的大括号是定要从profile.js导入的变量名。大括号里面的变量必须必须与被导入模块(profile.js)对外接口的名称相同。

import后面的from指定模块文件的位置,可以是相对路径,也可以是绝对路径,.js后缀可以省略。如果只是模块名,不带有路径,那么必须有配置文件,告诉 JavaScript 引擎该模块的位置。

import {myMethod} from 'util';

上面代码中,util是模块文件名,由于不带有路径,必须通过配置,告诉引擎怎么取到这个模块。

import命令是编译阶段执行的,在代码运行之前。

import命令具有提升效果,会提升到整个模块的头部,首先执行。所以如下代码不会报错。

foo();import { foo } from 'my_module';

由于import是静态执行,所以不能使用只有在运行时才能得到结果的语法结构。

// 报错import { 'f' + 'oo' } from 'my_module';// 报错let module = 'my_module';import { foo } from module;// 报错if (x === 1) {  import { foo } from 'module1';} else {  import { foo } from 'module2';}

上面三种写法都会报错,因为它们用到了表达式、变量和if结构。在静态分析阶段,这些语法都是没法得到值的。

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

import 'lodash';

export default 命令

export default命令,为模块指定默认输出。

// export-default.jsexport default function () {  console.log('foo');}

上面代码是一个模块文件export-default.js,它的默认输出是一个函数。

其他模块加载该模块时,import命令可以为该匿名函数指定任意名字。

// import-default.jsimport customName from './export-default';customName();   // 'foo'

export default命令用在非匿名函数前,也是可以的。

// export-default.jsexport default function foo() {  console.log('foo');}// 或者写成function foo() {  console.log('foo');}export default foo;

上面代码中,foo函数的函数名foo,在模块外部是无效的。加载的时候,视同匿名函数加载。

注意:下面比较一下默认输出和正常输出。

// 第一组export default function crc32() { // 输出  // ...}import crc32 from 'crc32'; // 输入// 第二组export function crc32() { // 输出  // ...};import {crc32} from 'crc32'; // 输入

上面代码的两组写法,第一组是使用export default时,对应的import语句不需要使用大括号;第二组是不使用export default时,对应的import语句需要使用大括号。

export default命令用于指定模块的默认输出。显然,一个模块只能有一个默认输出,因此export default命令只能使用一次。所以,import命令后面才不用加大括号,因为只可能对应一个方法。

module.exports

Node 采用 CommonJS模块格式,在Node环境中,使用import命令加载 CommonJS模块,Node会自动将module.exports属性,当作模块的默认输出,即等同于export default。

// a.jsmodule.exports = {  foo: 'hello',  bar: 'world'};// 等同于export default {  foo: 'hello',  bar: 'world'};

import命令加载上面的模块,module.exports会被视为默认输出。

import baz from './a';// baz = {foo: 'hello', bar: 'world'};

转载于:https://www.cnblogs.com/renzhiwei2017/p/7442395.html

你可能感兴趣的文章
《梦断代码》读书笔记(三)
查看>>
FreeMarker解析json数据
查看>>
Java8 Lambda表达应用 -- 单线程游戏server+异步数据库操作
查看>>
次序+“选择不重复的记录”(3)——最大记录
查看>>
Codeforces 450 C. Jzzhu and Chocolate
查看>>
[Unity3D]Unity3D游戏开发MatchTarget的作用攀登效果实现
查看>>
ACdream 1115 Salmon And Cat (找规律&&打表)
查看>>
JSON、JSONP、Ajax的区别
查看>>
AngularJS学习篇(一)
查看>>
关于Xshell无法连接centos6.4的问题
查看>>
css3动画——基本准则
查看>>
javaweb常识
查看>>
Java注解
查看>>
web自己主动保存表单
查看>>
一个小的日常实践——高速Fibonacci数算法
查看>>
机器学些技法(9)--Decision Tree
查看>>
drf权限组件
查看>>
输入月份和日期,得出是今年第几天
查看>>
Qt中子窗口全屏显示与退出全屏
查看>>
使用brew安装软件
查看>>