seajs的原理以及基本使用

来源:https://www.cnblogs.com/z937741304/archive/2018/07/29/9387812.html
-Advertisement-
Play Games

seajs模塊化開發 模塊化開發,把整個文件分割成一個一個小文件。 使用方法 使用方法特別簡單,首先在官網中下載sea.js,然後在頁面中引入。 index.html part1.js 有一些需要註意的地方 另外這一種判斷使用哪個模塊的 require.async 方法用來在模塊內部非同步載入模塊,並 ...


seajs模塊化開發

  模塊化開發,把整個文件分割成一個一個小文件。

使用方法

  使用方法特別簡單,首先在官網中下載sea.js,然後在頁面中引入。

index.html

// 1.路徑
// 2.回調 (在js文件里定義的module.exports里定義的)
seajs.use('./js/part1.js',function (dom) {
    console.log(dom);
    let a = dom('#box');
    console.log(a);
}); 

part1.js

// 1.在js文件里互相引用模塊
// 2.暫時不用管
// 3.導出(告訴別的文件可以使用我的xxx東西)
define(function (require,exports,module) {
    //這裡是定義模塊的地方
    function fn(dom) {
        return document.querySelector(dom);
    }
    module.exports = fn;
});

有一些需要註意的地方

define(function(require,exports,module){
    //這裡的require就把他當成一個關鍵字就可以了,不要去改變他
})

另外這一種判斷使用哪個模塊的

//條件 這種情況就不推薦使用下麵這種方式了,下麵的會把兩種都編譯還是什麼的,推薦使用require.async
define(function(require,exports,module){
    if(a){
        require('hello');
    }else{
        require('word');
    }
})

require.async

  方法用來在模塊內部非同步載入模塊,併在載入完成後執行指定回調。callback 參數可選。

define(function(require, exports, module) {
  // 非同步載入一個模塊,在載入完成時,執行回調
  require.async('./b', function(b) {
    b.doSomething();
  });
    
  // 非同步載入多個模塊,在載入完成時,執行回調
  require.async(['./c', './d'], function(c, d) {
    c.doSomething();
    d.doSomething();
  });
});
註意:require 是同步往下執行,require.async 則是非同步回調執行。require.async 一般用來載入可延遲非同步載入的模塊

exports

exports 是一個對象,用來向外提供模塊介面。

define(function(require, exports) {
​
  // 對外提供 foo 屬性
  exports.foo = 'bar';
​
  // 對外提供 doSomething 方法
  exports.doSomething = function() {};
​
});

除了給 exports 對象增加成員,還可以使用 return 直接向外提供介面。

define(function(require) {
​
  // 通過 return 直接提供介面
  return {
    foo: 'bar',
    doSomething: function() {}
  };
});

如果 return 語句是模塊中的唯一代碼,還可簡化為:

define({
  foo: 'bar',
  doSomething: function() {}
});

上面這種格式特別適合定義 JSONP 模塊。

特別註意:下麵這種寫法是錯誤的!

define(function(require, exports) {
  // 錯誤用法!!!
  exports = {
    foo: 'bar',
    doSomething: function() {}
  };
});

正確的寫法是用 return 或者給 module.exports 賦值:

define(function(require, exports, module) {
  // 正確寫法
  module.exports = {
    foo: 'bar',
    doSomething: function() {}
  };
});

提示exports 僅僅是 module.exports 的一個引用。在 factory 內部給 exports 重新賦值時,並不會改變 module.exports 的值。因此給 exports 賦值是無效的,不能用來更改模塊介面。

 

模擬他的原理

  步驟如下:

​   1.html文件: seajs.use(1,2)執行

​   2.插件: 模塊插件 創建一個script標簽 通過script把模塊引入進來

​   3.插件: 定義一個全局函數define,用來獲取模塊裡面所寫的代碼

​   4.模塊:模塊文件里 執行defined(傳入一個函數)

​  5.插件: seajs.use插件 執行上一步的函數 並且傳入三個參數

​   6.再執行模塊里傳入的參數過程中,改變了module

​   7.插件:插件里:執行回調函數,插件的第二個參數

  ​ 8.插件:刪除掉上面加入的script標簽

sea.js

let seajs = {};
seajs.use = function
seajs(url,cb) { let oScript = document.createElement('script'); let s = document.getElementsByTagName('script')[0]; oScript.src = url; s.parentNode.insertBefore(oScript,s); /*function fn(dom) { return document.querySelector(dom); }*/ let require, exports, module = {}; window.define = function (fn) { fn(require,exports,module); cb(module.exports); s.parentNode.removeChild(oScript); }; }

index.html

seajs('./a.js',function(fn){
   let a = fn('#box');
   console.log(a);      
})

a.js

define(function (require,exports,module) {
    //這裡是定義模塊的地方
    function fn(dom) {
        return document.querySelector(dom);
    }
    module.exports = fn;
});

  上面的代碼就是模擬了一下載入模塊的原理,其實就是自己新建了一個script標簽,將那個引入的模塊添加到了當前頁面當中,和JSONP差不多的原理,模塊中的define函數自己執行,將裡面的函數傳遞到sea.js插件中,然後再去做處理,sea.js將模塊中的module.exports = 的東西提取出來,回調函數傳遞給index中,接受到了這個模塊中的module.exports。

  其實我寫的不是很清楚了,哈哈,可以用自己的方式去實現一下,我在這裡寫的這篇主要是對這兩天學的一些東西做一下總結。

  當然,如果你能從中收穫一些我會非常高興的,如果看到這裡感覺什麼都沒用可以去官網去查看,上面講的非常清楚。sea.js官網


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 占座 ...
  • exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'Ad Hoc Distributed Queries',1 reconfigure SELECT * into T_System_Organizati ...
  • 對於許多數據科學家來說,數據操作起始於Pandas或Tidyverse。從理論上看,這個概念沒有錯。畢竟,這是為什麼這些工具首先存在的原因。然而,對於分隔符轉換等簡單任務來說,這些選項通常可能是過於重量級了。 有意掌握命令行應該在每個開發人員的技能鏈上,特別是數據科學家。學習shell中的來龍去脈無 ...
  • 在數據遷徙的時候需要使源和目標資料庫的字元集、版本等信息統一…… 這裡是對一個資料庫的設置,需要在兩邊進行同樣的操作。 SYS@PROD1> select userenv('language') from dual; USERENV('LANGUAGE') AMERICAN_AMERICA.ZHS1 ...
  • 此前在校學習期間,只是知道資料庫很重要,但是並未主動去學習瞭解。現在的學習過程中學了一遍mysql,就簡單的做一個總結吧。 首先記住三個概念: 1.資料庫(Database)是按照數據結構來組織、存儲和管理數據的建立在電腦存儲設備上的倉庫。 2.SQL :結構化查詢語言(Structured Qu ...
  • Document(文檔)是Field(域)的承載體, 一個Document由多個Field組成. Field由名稱和值兩部分組成, 值是要索引的內容, 也是要搜索的內容. Lucene在記憶體中實現了分頁查詢, 這裡通過一個分頁查詢的demo演示分頁的過程. ...
  • 運行後界面空白,Xcode跳轉到APPDelegate.swift文件提示如下 第一種可能原因: 做輸出口後在代碼中重新命名了輸出口 解決方法: 右鍵控制項關閉輸出口的連接,變回+號,將它重新連到代碼的var...處鬆開。 或者直接刪除代碼代碼重新做輸出口。 第二種可能原因: 修改了ViewContr ...
  • 一,效果圖。 二,代碼。 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Todo</title> <meta name="viewport" content="initial-scale=1, maximum-scale=1, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...