export、exports、modules.exports 和 require 、import 的一些组合套路和坑
推荐阅读第三方文章:
http://www.tuicool.com/articles/uuUVBv2
引入: require / import
导出:export / module.exports / exports
Nodejs 不支持 import 和 export
es6 兼容以上所有语法,当然需要 webpack + babel 来支撑
尽管es6兼容以上所有语法,但需要注意:
在webpack打包的时候,可以在js文件中混用 require 和 export。但是不能混用 import 以及 module.exports
“Uncaught TypeError: Cannot assign to read only property 'exports' of object '#<Object>'”
解决办法就是统一改成 ES6 的方式编写: import 和 export
但如果使用export default ... 的方式,是无法使用import { ... } from '...' 的高逼格方式的,如果我硬要使用这种方式怎么办呢?其实可以这样: export {...}
需要注意的是,这里的{ ... } 不能自定义key,只能以真实的函数名或者类名导出
如果是这样混用的话,单元测试的时候就会很糟糕。举个例子:
我新建一个fuck.test.js,Nodejs 中我引入(require)了一个 es6 写的类库用来测试。但这个类都是使用 export default { ... } 的方式导出的。
前面说过,Nodejs 是不支持 export 的。所以会报错。不仅如此,如果该es6类库还使用了 import 语法引入了其他库。更加会报错。因为nodejs不支持import。
解决方案是什么呢?有没有想过,为什么其他第三方库可以正常引入无论是es6还是nodejs?这需要套路!
套路: 先不考虑其他第三方是如何做到的。我们先自己约束和规范好。
譬如说,引入文件的方式使用双方通用的require!
但导出怎么办?双方似乎没有协同点?没关系。我们可以从 es6 + webpack + babel 入手: http://npm.taobao.org/package/babel-plugin-transform-es2015-modules-commonjs
下载并且使用这个babel插件:在,babelrc的plugins中加入代码: "plugins": ["transform-es2015-modules-commonjs"]
然后,我们的es6代码就支持 module.exports 了。这样一来,我们的导出统一使用 module.exports (需要babel插件支持)即可!
总而言之一句话:导入用require, 导出用module.exports
(ps: 不知从什么时候开始,es6居然已经支持module.exports了。)
es6 : import { ... } from '...'
lib.js:
// 多重导出export
export const a = () => 123
export const b = () => 456
export const c = () => 789 __________________________________________________________
// 使用 nodejs 内置的 global.module.exports 方法导出
module.exports = {
a: () => 123,
b: () => 456,
c: () => 789,
} __________________________________________________________
// export 对象导出,请注意,这里的 { a, b, c } 并不是es6 对 key: value 形式的缩写,而是只能以这种方式写
const a = () => 123
const b = () => 456
const c = () => 789
export { a, b, c } __________________________________________________________ main.js:
import { a, b, c } from './lib.js'
console.log(a()) // => 123
console.log(b()) // => 345
console.log(c()) // => 678
es6:export default { foo, bar, baz... }
注意,这里也支持单独导出一个,如 export default incrementCounter
// export default {...}
export default {
a: () => 123,
b: () => 456,
c: () => 789
} // import
import foo from './lib.js'
console.log(foo) // => {a: ƒ, b: ƒ, c: ƒ} // require
var bar = require('./lib.js')
console.log(bar) // => {default: {…}, __esModule: true}
console.log(bar.default) // => {a: ƒ, b: ƒ, c: ƒ}
nodejs:exports.foobar 和 module.exports 对比
http://www.cnblogs.com/wbxjiayou/p/5767632.html
总结以下几点:
对于只导出属性的情况,可以简单直接使用 exports.foobar 的方式。当然函数也可以这样使用,只是使用场景较少;通常建议直接使用module.exports
对于类,为了直接使导出的内容作为类的构造器可以让调用者使用new操作符创建实例对象,应该把构造函数挂到
module.exports
对象上,不要和导出属性值混在一起;- 需要将模块定义为一个类或函数时,只能使用“module.exports” 的书写方法;
exports.spa_shell = function fn () {};
// 接收示例
let abc = require('./spa.shell.js');
import abc from './spa.shell.js';
// 使用示例
abc.spa_shell.initModule( $container );
module.exports = function fn() {};
// 接收示例
let abc = require('./spa.shell.js');
import abc from './spa.shell.js';
// 使用示例
abc.initModule( $container );
export、exports、modules.exports 和 require 、import 的一些组合套路和坑的更多相关文章
- 探讨ES6的import export default 和CommonJS的require module.exports
今天来扒一扒在node和ES6中的module,主要是为了区分node和ES6中的不同意义,避免概念上的混淆,同时也分享一下,自己在这个坑里获得的心得. 在ES6之前 模块的概念是在ES6发布之前就出 ...
- module.exports 、 exports 和 export 、 export default 、 import
1:commonjs规范 module.exports={a:10,b:20} var test=require('lib/test') console.log(test.a);console.log ...
- module.exports与exports,export和export default
还在为module.exports.exports.export和export default,import和require区别与联系发愁吗,这一篇基本就够了! 一.首先搞清楚一个基本问题: modu ...
- Node.js模块导出module.exports 和 exports,Es6模块导出export 和export default的区别
1.module.exports module变量代表当前模块.这个变量是一个对象,module对象会创建一个叫exports的属性,这个属性的默认值是一个空的对象: module.exports ...
- module.exports与exports,export与export default之间的关系和区别
首先我们要明白一个前提,CommonJS模块规范和ES6模块规范完全是两种不同的概念. CommonJS模块规范 Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个 ...
- module.exports 、exports、export、export default的区别
module.exports和exports是属于 CommonJS 模块规范,export和export default是属于ES6语法. module.exports和exports导出模块,用r ...
- module.exports与exports,export与export default的区别
首先我们要明白一个前提,CommonJS模块规范和ES6模块规范完全是两种不同的概念. CommonJS模块规范 Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个 ...
- exports module.exports export export default之间的关系
exports 和module.exports是CommonJS模块规范 export export default是ES6模块的规范,两者完全是不同的概念. node应用由模块组成,采用的是Comm ...
- ES6和CommonJS的区别 以及 export和module.exports的区别
ES6和CommonJS的区别 Javascript javascript是一种脚本编程语言,有自己独立的语法与语义,没有javascript,也就没有其他的那些概念了. ES6 JavaScript ...
随机推荐
- mogodb优化
http://snoopyxdy.blog.163.com/blog/static/6011744020157511536993/ http://www.csdn.net/article/2012-1 ...
- 关于U盘启动操作系统《30天自制操作系统》
原本的启动是从img启动的,并且这个img是用FAT12文件系统进行格式化的(详细去搜索FAT12文件格式,这里给大家推荐一篇http://www.doc88.com/p-646605198560.h ...
- std::string compare
#include <iostream> #define NULL 0 #define MAX_LIMIT 5 //#define MAX_LENGTH 2 bool ComparePC2S ...
- 内核镜像zImage是如何生成的
转载:内核镜像zImage是如何生成的 内核镜像zImage是如何生成的 前面两篇文章介绍了vmlinux 文件生成,这个文件必然是核心的linux内核,但是它是ELF格式的文件,其中包含了可执行的二 ...
- 第一章 在linux下python读串口 存MYSQL数据库(703N)
import MySQLdb//定义引用数据库的驱动文件 import serial import time ser = serial.Serial('/dev/ttyATH0', 115200, t ...
- iOS网络编程解析协议三:JSON数据传输解析
作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 基于JavaScript的一个子集 易读性略差,编码手写难度大,数据量小 JSON格式取代了XML给网络传输带来了很大的便利, ...
- PowerDesigner教程系列(一)概念数据模型
目标: 本文主要介绍PowerDesigner中概念数据模型 CDM的基本概念. 一.概念数据模型概述 数据模型是现实世界中数据特征的抽象.数据模型应该满足三个方面的要求:1)能够比较真实地模拟现实世 ...
- Deep Learning论文笔记之(一)K-means特征学习
Deep Learning论文笔记之(一)K-means特征学习 zouxy09@qq.com http://blog.csdn.net/zouxy09 自己平时看了一些论文,但老感 ...
- 《javascript高级程序设计》读书笔记(一)javascript简单介绍
第一章:javascript简单介绍 Netscape Navigator 开发的javascript Javascript的实现有三部分: 1.核心(ECMAScript):提供核心语言功能. ...
- Python Web Scraper - Simple Url Request
from urllib.request import urlopen html = urlopen("http://www.baidu.com") print(html.read( ...