推荐阅读第三方文章:

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

总结以下几点:

  1. 对于只导出属性的情况,可以简单直接使用 exports.foobar 的方式。当然函数也可以这样使用,只是使用场景较少;通常建议直接使用module.exports

  2. 对于类,为了直接使导出的内容作为类的构造器可以让调用者使用new操作符创建实例对象,应该把构造函数挂到module.exports对象上,不要和导出属性值混在一起;

  3. 需要将模块定义为一个类或函数时,只能使用“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 和 require(import)的一些技巧和常用方法的更多相关文章

  1. C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import)

    上一篇学习完了MEF的基础知识,编写了一个简单的DEMO,接下来接着上篇的内容继续学习,如果没有看过上一篇的内容, 请阅读:http://www.cnblogs.com/yunfeifei/p/392 ...

  2. export,export default和import的区别以及用法

    首先要知道export,import ,export default是什么 ES6模块主要有两个功能:export和import export用于对外输出本模块(一个文件可以理解为一个模块)变量的接口 ...

  3. export ,export default 和 import 区别 以及用法

    首先要知道export,import ,export default是什么 ES6模块主要有两个功能:export和importexport用于对外输出本模块(一个文件可以理解为一个模块)变量的接口i ...

  4. export ,export default 和 import 区别以及用法

    首先要知道export,import ,export default是什么 ES6模块主要有两个功能:export和importexport用于对外输出本模块(一个文件可以理解为一个模块)变量的接口i ...

  5. module、export、require、import的使用

    module 每个文件就是一个模块.文件内定义的变量.函数等等都是在自己的作用域内,都是自身所私有的,对其它文件不可见. 每个文件内部都有一个module对象,它包含以下属性 id: 模块的识别符,通 ...

  6. 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 ...

  7. export命令和import命令 详解

    export命令 模块功能主要由两个命令构成:export和import. export命令用于用户自定义模块,规定对外接口: import命令用于输入其他模块提供的功能,同时创造命名空间(names ...

  8. es6中export、export default、import的理解

    export 与 import 的使用 export 与import是es6中新增模块功能最主要的两个命令.我们要知道在es6中,实现了模块功能,而且相当简单,意在取代commonjs和AMD规范.成 ...

  9. Docker镜像Export导出和Import导入

    在使用Docker时最头痛的无非无法获取仓库镜像,我们可以通过Export导出镜像备份,通过import导入镜像.导出镜像是通过容器进行导出,下面来看镜像对应的容器: root@default:~# ...

随机推荐

  1. C#与mysql做ASP.NET网页数据库查询速度测试

    两种方法是:1,使用mysql数据库的存储过程:2,C#编码,做网页后台与mysql数据库连接,前台测试显示测试过结果下面我将分别讲解两种方法的具体实现. 1,使用mysql数据库的存储过程插入万条大 ...

  2. SpringMVC中向服务器传递时间参数时出现的问题

    1. 问题描述: 今天在SpringMVC应用中上传参数的时候遇到如下问题: The request sent by the client was syntactically incorrect 这说 ...

  3. BestCoder Round #73 (div.2)

    1001 Rikka with Chess ans = n / 2 + m / 2 1002 Rikka with Graph 题意:n + 1条边,问减去至少一条使剩下的图连通的方案数. 分析:原来 ...

  4. 锐捷 Linux登录命令

    cd /home/ficow/桌面/rjsupplicant&&sudo chmod +x ./rjsupplicant.sh&&sudo chmod +x ./rjs ...

  5. Open CV 图像显示(1)

      演示:读入一张图片,并显示   #include "stdafx.h"   #include <opencv2/core/core.hpp>   #include  ...

  6. MR并行算法编程过程中遇到问题的思考

    1. Reducer 类中 reduce函数外定义的变量是在Reducer机器上属于全局变量的,因此,一台机器上reduce函数均可以对该变量的值做出贡献.如代码:(sum和count数据Reduce ...

  7. ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 H. Hashing

    H. Hashing time limit per test 1 second memory limit per test 512 megabytes input standard input out ...

  8. Kalman滤波器原理和实现

    Kalman滤波器原理和实现 kalman filter Kalman滤波器的直观理解[1] 假设我们要测量一个房间下一刻钟的温度.据经验判断,房间内的温度不可能短时大幅度变化,也就是说可以依经验认为 ...

  9. Hive内部表外部表转化分析(装)

    link:http://anyoneking.com/archives/127hive表分为内部表和外部表.外部表在删除的时候并不会删除到hdfs中的文件,比较安全,所以对于重要的需要进行分析的日志建 ...

  10. BZOJ 1013 & 高斯消元

    题意: 告诉你一个K维球体球面上的K+1个点问球心坐标. sol: 乍一看还以为是K维的二分答案然后判断距离...真是傻逼了...你看乱七八糟的题目做多了然后就会忘记最有用的基本计算... 我们可以看 ...