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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...