日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从module的简单实现到模块化

發布時間:2024/4/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从module的简单实现到模块化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

一直感覺模塊化是一個很神秘的概念,因而也很感興趣,有幸了解到了模塊化的歷史,嘗試著了解了一下模塊化的實現,發現了一個很有意思的東西,不知道為什么,會覺得很有成就感,記錄一下。

模塊化的實現

簡單模擬一下CMD的module實現,在module.js中做以下處理

//module.js exports.word = 'hello' module.exports = function () {console.log(exports.word) } 復制代碼

然后在test.js界面引入該模塊

//test.js const file = require('./module.js') file() // hello console.log(file.word) //undefined 復制代碼

不考慮為什么會有這樣的結果,上面的這部分是通過require引用模塊的常見寫法。下面的超簡化版本代碼實現了超簡化的require方法(下面的runner方法)

//require.js const fs = require('fs') const path = require('path')function runner(file) {const code = fs.readFileSync(path.join(__dirname, file), 'utf-8')const module = { exports: {} }const fn = new Function('module', 'exports', code)fn(module, module.exports)return module.exports } 復制代碼

這里的fn整理出來就是下面這一段代碼

function _fn(module, exports) {exports.word = 'hello'module.exports = function() {console.log(exports.word)} } 復制代碼

所以在執行fn(module, module.exports)時,就是對上面聲明的const module = { exports: {} }進行賦值。當執行runner方法時,其實就是獲取module.exports的值。而runner方法做的事,就是獲取文件中的內容,識別module.exports,并把該值拋出來。轉到require,其實主要做的也就是這部分工作。module和 export也就成了關鍵詞,用來在讀取模塊的時候識別的標識。

runner方法已經實現了,現在來看一下為什么運行后是這樣的結果。

export 與 module.export

通過上面runner的實現,也可以看出,其實exports和module.exports最后被引用后其實是一個。最后暴露出來的都是module對象,而如果一個頁面中同時存在exports和module.exports,最后一個引用都會覆蓋掉掉前面所有的exports引用,所以這也是為什么上面的file()能執行成功,而file.word為undefined,因為前者覆蓋了后者。file已經被替換成了下面這個方法

function() {console.log(exports.word) } 復制代碼

模塊化

那么什么叫模塊化呢?我的理解有3點:

  • 引用的時候能按需調用
  • 外部調用無法修改內部參數
  • 沒有全局變量的污染,方法名不沖突
  • 因為看了模塊化的歷史,了解到模塊化最最原始是從匿名閉包衍生出來的,再看看現在的module的實現,其實也是一個閉包。雖然之前看了很多閉包的概念,但因為使用上的局限性,一直把閉包誤解為只有return出去的才是閉包。比如下面這段代碼

    function fo(){var a = 'aaa';return function(){console.log(a)} } var bar = fo(); 復制代碼

    這次看到這個是真的有刷新我的認知,原來下面這樣的也是閉包

    var b = {a: {} } function fo(obj){let a = 'aaa';obj.a = function(){console.log(a)} } fo(b.a); 復制代碼

    把上面這個再擴展一下就成了下面這段代碼,一段類似_fn的代碼

    var b = {a: {} } function fo(b, a){a = '111';b.a = function(){console.log(a)} } fo(b, b.a); 復制代碼

    重復一波閉包的概念:能夠讀取其他函數內部變量的函數

    所以這也是為什么上面的file()的結果是hello,這也是requireJS的模塊化里面我暫時接觸到的最有意思的地方。下次瞅一瞅es6的模塊化

    相關知識

    模塊化的歷史:huangxuan.me/js-module-7…

    超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

    總結

    以上是生活随笔為你收集整理的从module的简单实现到模块化的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 337p粉嫩大胆色噜噜狠狠图片 | 日韩av线上 | 91制服诱惑| 欧美黄色一区 | 午夜影院日本 | 青青草精品视频 | h视频免费在线观看 | 色黄大色黄女片免费中国 | 性高跟鞋xxxxhd人妖 | 熟妇高潮一区二区三区 | 国产精品一区二区入口九绯色 | 日本精品一区二区三区四区 | 美女被日网站 | 午夜影院试看 | 日本欧美韩国国产精品 | 免费在线观看成人 | 加勒比视频在线观看 | 男人的天堂一区二区 | 邻家有女4完整版电影观看 欧美偷拍另类 | 小小姑娘电影大全免费播放 | 国产精华一区二区三区 | 日韩一区二区视频在线播放 | 午夜免费福利影院 | 日韩 欧美 国产 综合 | 高跟鞋和丝袜猛烈xxxxxx | 久久99中文字幕 | 91精品国产乱码 | 人妻体体内射精一区二区 | av在线导航 | 免费成人在线观看 | www.中文字幕av| 国产国产精品 | 欧美日韩视频 | 国产精品影院在线观看 | 久久.com| 亚洲免费一级片 | 国产成人福利 | 狠狠躁18三区二区一区视频 | 午夜视频一区二区 | 成人18视频在线观看 | 亚洲最大免费视频 | 日韩美女黄色片 | 91国内精品 | 免费一级a毛片夜夜看 | 欧美xxxxx自由摘花 | 国产精品天美传媒沈樵 | 天堂在线视频免费观看 | 国产ts在线 | 国产精品不卡一区二区三区 | 黑白配高清国语在线观看 | 毛片在哪看 | 一级二级三级视频 | 天天色天天干天天色 | 狠狠a | 欧美视频你懂的 | 国产+日韩+欧美 | 日日操夜夜操视频 | 黄色一级a毛片 | 久久久久亚洲av无码专区首jn | 亚洲国产97| 在线中文视频 | 亚洲精品99久久久久中文字幕 | 麻豆传媒在线免费 | 国产剧情一区 | 日韩亚洲欧美在线观看 | 青青草原av在线 | 黄页网站免费在线观看 | 男女一级特黄 | 99这里有精品| 日韩在线导航 | 九九热在线免费视频 | 99无码熟妇丰满人妻啪啪 | 日韩欧美中文字幕在线视频 | 人妻少妇久久中文字幕 | 乳揉みま痴汉4在线播放 | 欧美 另类 交 | 国产精品久久久久久久免费大片 | 国产日韩中文 | 欧美特级a| 国产有码视频 | 台湾swag在线播放 | 成人在线播放网站 | 极品美女高潮 | 一区二区三区视频在线 | 国产欧美精品一区二区色综合 | 正在播放adn156松下纱荣子 | 欧美美女性生活 | 少女忠诚电影高清免费 | 欧美成人aaa| 国产sm在线观看 | 美女视频免费在线观看 | 久久成人国产精品 | 日本色一区 | 手机在线视频一区 | 欧美一区二区三区久久久 | 国产又黄又粗又硬 | 欧美福利电影 | 精品一区二区三区毛片 | 97自拍偷拍 |