详解JS模块导入导出


Posted in Javascript onDecember 20, 2017

开发中基本不会将所有的业务逻辑代码放在一个JS文件中,特别是在使用前端框架,进行组件化开发中时,会复用相应的组件。这时,就会用到模块导入/导出的方法了。

当然,上面提到有模块的概念,也是在JS用于服务器端编程的时候才会出现,我们在使用前端框架时,使用npm run dev,不就是启动了一个node服务。 对于JavaScript模块化编程的起源可以追溯到2009年,Ryan Dahl在github上发布了node 的最初版本。

本文主要介绍几种模块导入/导出的方法。

node 中模块导出/导入

平时我们接触最多的模块导入的例子,就是使用npm安装各种开源模块,然后在项目中使用例如import,require的方法引入,或者更加直白的直接使用script标签引入入node_module中对应模块打包过后的源文件。

为什么可以直接引入这些npm模块呢?一般在每个模块的源文件里面,都会找到modules.exports方法。用来导出变量。比如下面我们在使用gulp打包压缩时,经常使用到的gulp-rename这个插件通过npm安装后,在node_modules中的gulp-rename/index.js

'use strict';

var Stream = require('stream');
var Path = require('path');

function gulpRename(obj) {

 var stream = new Stream.Transform({objectMode: true});
 ... 

 return stream;
}

module.exports = gulpRename;

看到的基本思路就是,定义了gulpRename 方法,然后把它抛出去。

node中的module都遵循CommonJS规范。在CommonJS中有一个全局的require()方法,用于加载模块;module.export 和 export 方法,导出模块。

这里比较重要的一点是: 我们在写模块时用到的exports对象实际上只是对module.exports的引用,所有在一些js库的源码中,经常可以看到这样的写法:

exports = module.exports = somethings

// export.js 文件中
var export1 = "from export1"
var export2 = function(){
 return "from export2";
}
exports.export2 = export2;
 // modules.js 文件中
 var module1 = "from module1";
 var module2 = function(e){
 return "from funModule2";
 }
 module.exports.str1 = module1;
 module.exports.fun2 = module2;

最后在common.js文件中引入exports.js文件和 modules.js 文件,

var md1 = require("./module.js")
console.log(md1);
var export3 = require("./export");
console.log(export3);

最后在gitbash中,使用node 执行相应的commons.js文件;

详解JS模块导入导出

在使用exports方法是,不能直接exprots = {},这样改变了exports方法的引用, 相应就无法实现导出模块的功能了。

es6导出方法

es6中也同样提出了比较好用的模块导出的方法,包括两种。

命名导出

如果在一个文件中想要导出多个不同的变量,可以分别对不同的变量命名,然后分别导出,避免相互污染。

// export3.js 文件
 export const myModules = {c:1 }
 export const myModules2 = {d:2 }
 // import.js 文件
 import {myModule1,myModule2} from './export3.js' ;
 console.log(myModule1);
 console.log(myModule2);
 // index.html 文件
<!DOCTYPE html>
<html>
 <head>
 <meta charset="utf-8">
 <title>es6</title>
 </head>
 <body>
 <script src="./import.js"></script>
 </body>
</html>

然后,我们尝试使用最经新出的 打包工具parcel(node版本在8.0以下安装会报错)小试牛刀, 具体已经安装完成了,在命令行中输入 parcel index.html,就会在1234 端口启动服务,主要为了能够在http://localhost:1234/中看到console。

详解JS模块导入导出

默认导出

如果只在一个文件中提供了一个导出的口,就可以使用默认导出

//export4.js 
 const str2 ="hello world";
 export default str2 ;
 // import2.js
 import anyName from "./export4.js"
 console.log(anyName);

在index.html 中 <script src="./import2.js"></script>可以看到输入 hello world

同样是模块导入导出方法,使用es6的模块方法,要比node中 的(也就是CommonJS模块)方法更加的差异非常大。
主要有如下两点差别:

CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。

CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。

以上就是我们本次给大家介绍的关于JS模块导入导出问题的全部内容,如果大家还有任何不明白的地方可以在下方的留言区域讨论,感谢你对三水点靠木的支持。

Javascript 相关文章推荐
javascript中的delete使用详解
Apr 11 Javascript
用javascript读取xml文件读取节点数据
Aug 12 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
Nov 18 Javascript
利用yarn实现一个webpack+react种子
Oct 25 Javascript
微信小程序五星评分效果实现代码
Apr 06 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
Apr 19 Javascript
深入浅析vue-cli@3.0 使用及配置说明
May 08 Javascript
详解node登录接口之密码错误限制次数(含代码)
Oct 25 Javascript
js实现3D照片墙效果
Oct 28 Javascript
Angular8引入百度Echarts进行图表分析的实现代码
Nov 27 Javascript
vue组件暴露和.js文件暴露接口操作
Aug 11 Javascript
node koa2 ssr项目搭建的方法步骤
Dec 11 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
Dec 19 #Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
Dec 19 #Javascript
常用的9个JavaScript图表库详解
Dec 19 #Javascript
完美解决手机网页中输入框被输入法遮挡的问题
Dec 19 #Javascript
js解决软键盘遮挡输入框的问题分享
Dec 19 #Javascript
Angular2实现组件交互的方法分析
Dec 19 #Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
Dec 19 #Javascript
You might like
请php正则走开
2008/03/15 PHP
discuz Passport 通行证 整合笔记
2008/06/30 PHP
CodeIgniter上传图片成功的全部过程分享
2013/08/12 PHP
php 发送带附件邮件示例
2014/01/23 PHP
JS 继承实例分析
2008/11/04 Javascript
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
Javascript图像处理—为矩阵添加常用方法
2012/12/27 Javascript
JS实现的竖向折叠菜单代码
2015/10/21 Javascript
jquery easyui dataGrid动态改变排序字段名的方法
2017/03/02 Javascript
NodeJs模拟登陆正方教务
2017/04/28 NodeJs
Vue.js学习教程之列表渲染详解
2017/05/17 Javascript
关于vue.js v-bind 的一些理解和思考
2017/06/06 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
AngularJS实时获取并显示密码的方法
2018/02/06 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
微信小程序页面调用自定义组件内的事件详解
2019/09/12 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
Python实现图片滑动式验证识别方法
2017/11/09 Python
使用Python从零开始撸一个区块链
2018/03/14 Python
TensorFlow Session会话控制&amp;Variable变量详解
2018/07/30 Python
python远程调用rpc模块xmlrpclib的方法
2019/01/11 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
python 遍历pd.Series的index和value
2019/11/26 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
mac安装python3后使用pip和pip3的区别说明
2020/09/01 Python
matplotlib相关系统目录获取方式小结
2021/02/03 Python
纯CSS3实现表单验证效果(非常不错)
2017/01/18 HTML / CSS
初探CSS3中的calc()功能
2015/07/14 HTML / CSS
HTML5中的websocket实现直播功能
2018/05/21 HTML / CSS
加拿大时尚床上用品零售商:QE Home | Quilts Etc
2018/01/22 全球购物
EQVVS官网:设计师男装和女装
2018/10/24 全球购物
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
幼儿园教师个人反思
2014/01/30 职场文书
2014年工商所工作总结
2014/12/09 职场文书
2015年小学实验室工作总结
2015/07/28 职场文书
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python