詳解JS模塊導(dǎo)入導(dǎo)出
開發(fā)中基本不會(huì)將所有的業(yè)務(wù)邏輯代碼放在一個(gè)JS文件中,特別是在使用前端框架,進(jìn)行組件化開發(fā)中時(shí),會(huì)復(fù)用相應(yīng)的組件。這時(shí),就會(huì)用到模塊導(dǎo)入/導(dǎo)出的方法了。
當(dāng)然,上面提到有模塊的概念,也是在JS用于服務(wù)器端編程的時(shí)候才會(huì)出現(xiàn),我們在使用前端框架時(shí),使用npm run dev,不就是啟動(dòng)了一個(gè)node服務(wù)。 對于JavaScript模塊化編程的起源可以追溯到2009年,Ryan Dahl在github上發(fā)布了node 的最初版本。
本文主要介紹幾種模塊導(dǎo)入/導(dǎo)出的方法。
node 中模塊導(dǎo)出/導(dǎo)入
平時(shí)我們接觸最多的模塊導(dǎo)入的例子,就是使用npm安裝各種開源模塊,然后在項(xiàng)目中使用例如import,require的方法引入,或者更加直白的直接使用script標(biāo)簽引入入node_module中對應(yīng)模塊打包過后的源文件。
為什么可以直接引入這些npm模塊呢?一般在每個(gè)模塊的源文件里面,都會(huì)找到modules.exports方法。用來導(dǎo)出變量。比如下面我們在使用gulp打包壓縮時(shí),經(jīng)常使用到的gulp-rename這個(gè)插件通過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規(guī)范。在CommonJS中有一個(gè)全局的require()方法,用于加載模塊;module.export 和 export 方法,導(dǎo)出模塊。
這里比較重要的一點(diǎn)是: 我們在寫模塊時(shí)用到的exports對象實(shí)際上只是對module.exports的引用,所有在一些js庫的源碼中,經(jīng)常可以看到這樣的寫法:
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 執(zhí)行相應(yīng)的commons.js文件;
在使用exports方法是,不能直接exprots = {},這樣改變了exports方法的引用, 相應(yīng)就無法實(shí)現(xiàn)導(dǎo)出模塊的功能了。
es6導(dǎo)出方法
es6中也同樣提出了比較好用的模塊導(dǎo)出的方法,包括兩種。
命名導(dǎo)出
如果在一個(gè)文件中想要導(dǎo)出多個(gè)不同的變量,可以分別對不同的變量命名,然后分別導(dǎo)出,避免相互污染。
// 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>
然后,我們嘗試使用最經(jīng)新出的 打包工具parcel(node版本在8.0以下安裝會(huì)報(bào)錯(cuò))小試牛刀, 具體已經(jīng)安裝完成了,在命令行中輸入 parcel index.html,就會(huì)在1234 端口啟動(dòng)服務(wù),主要為了能夠在http://localhost:1234/中看到console。
默認(rèn)導(dǎo)出
如果只在一個(gè)文件中提供了一個(gè)導(dǎo)出的口,就可以使用默認(rèn)導(dǎo)出
//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
同樣是模塊導(dǎo)入導(dǎo)出方法,使用es6的模塊方法,要比node中 的(也就是CommonJS模塊)方法更加的差異非常大。
主要有如下兩點(diǎn)差別:
CommonJS 模塊輸出的是一個(gè)值的拷貝,ES6 模塊輸出的是值的引用。
CommonJS 模塊是運(yùn)行時(shí)加載,ES6 模塊是編譯時(shí)輸出接口。
以上就是我們本次給大家介紹的關(guān)于JS模塊導(dǎo)入導(dǎo)出問題的全部內(nèi)容,如果大家還有任何不明白的地方可以在下方的留言區(qū)域討論,感謝你對腳本之家的支持。
- JavaScript實(shí)現(xiàn)導(dǎo)入導(dǎo)出excel的示例代碼
- JavaScript實(shí)現(xiàn)excel文件導(dǎo)入導(dǎo)出
- 使用純前端JavaScript實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出方法過程詳解
- python3實(shí)現(xiàn)將json對象存入Redis以及數(shù)據(jù)的導(dǎo)入導(dǎo)出
- 詳解AngularJS中module模塊的導(dǎo)入導(dǎo)出
- js導(dǎo)入導(dǎo)出excel(實(shí)例代碼)
- Javascript模塊導(dǎo)入導(dǎo)出詳解
相關(guān)文章
查看圖片(前進(jìn)后退)功能實(shí)現(xiàn)js代碼
前進(jìn)后退實(shí)現(xiàn)的前提是:images文件夾下圖片的命名是從1~5.jpg有規(guī)律的,感興趣的朋友可以參考下哈,希望可以幫助到你2013-04-04js合并兩個(gè)數(shù)組生成合并后的key:value數(shù)組
這篇文章主要是介紹了js將兩個(gè)數(shù)組合并為類json方式,需要的朋友可以參考下2018-05-05小程序使用scroll-view實(shí)現(xiàn)一個(gè)滑動(dòng)列表功能
scroll-view可實(shí)現(xiàn)一個(gè)可滾動(dòng)的視圖區(qū)域,下面這篇文章主要給大家介紹了關(guān)于小程序使用scroll-view實(shí)現(xiàn)一個(gè)滑動(dòng)列表功能的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08js對象實(shí)例詳解(JavaScript對象深度剖析,深度理解js對象)
下面小編就為大家?guī)硪黄猨s對象實(shí)例詳解(JavaScript對象深度剖析,深度理解js對象)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09Auto.js自動(dòng)收取自己和好友螞蟻森林能量腳本
這篇文章主要為大家詳細(xì)介紹了Auto.js自動(dòng)收取自己和好友螞蟻森林能量腳本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06純js實(shí)現(xiàn)瀑布流布局及ajax動(dòng)態(tài)新增數(shù)據(jù)
這篇文章主要介紹了基于javascript實(shí)現(xiàn)瀑布流布局,及ajax動(dòng)態(tài)新增數(shù)據(jù)的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-04-04input鏈接頁面、打開新網(wǎng)頁等等的具體實(shí)現(xiàn)
input可以鏈接到某頁、返回、打開新網(wǎng)頁、打開無邊框的新窗口等等,本文整理了一些,感興趣的朋友可以參考下2013-12-12