中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

Webpack 實現 AngularJS 的延遲加載
來源:易賢網 閱讀:1924 次 日期:2016-08-02 16:22:31
溫馨提示:易賢網小編為您整理了“Webpack 實現 AngularJS 的延遲加載”,方便廣大網友查閱!

這篇文章主要介紹了Webpack 實現 AngularJS 的延遲加載的相關資料,需要的朋友可以參考下

隨著你的單頁應用擴大,其下載時間也越來越長。這對提高用戶體驗不會有好處(提示:但用戶體驗正是我們開發單頁應用的原因)。更多的代碼意味著更大的文件,直到代碼壓縮已經不能滿足你的需求,你唯一能為你的用戶做的就是不要再讓他一次性下載整個應用。這時,延遲加載就派上用場了。不同于一次性下載所有文件,而是讓用戶只下載他現在需要的文件。

所以。如何讓你的應用程序實現延遲加載?它基本上是分成兩件事情。把你的模塊拆分成小塊,并實施一些機制,允許按需加載這些塊。聽起來似乎有很多工作量,不是嗎?如果你使用 Webpack 的話,就不會這樣。它支持開箱即用的代碼分割特性。在這篇文章中我假定你熟悉 Webpack,但如果你不會的話,這里有一篇介紹 。為了長話短說,我們也將使用 AngularUI Router 和 ocLazyLoad 。

代碼可以在 GitHub 上。你可以隨時 fork 它。

Webpack 的配置

沒什么特別的,真的。實際上從你可以直接從文檔中復制然后粘貼,唯一的區別是采用了 ng-annotate ,以讓我們的代碼保持簡潔,以及采用 babel 來使用一些 ECMAScript 2015 的魔法特性。如果你對 ES6 感興趣,可以看看 這篇以前的帖子 。雖然這些東西都是非常棒的,但是它們都不是實現延遲加載所必需的東西。

// webpack.config.js

var config = {

entry: {

app: ['./src/core/bootstrap.js'],

},

output: {

path: __dirname + '/build/',

filename: 'bundle.js',

},

resolve: {

root: __dirname + '/src/',

},

module: {

noParse: [],

loaders: [

{ test: /\.js$/, exclude: /node_modules/,

loader: 'ng-annotate!babel' },

{ test: /\.html$/, loader: 'raw' },

]

}

};

module.exports = config;

應用

應用模塊是主文件,它必須被包括在 bundle.js 內,這是在每一個頁面上都需要強制下載的。正如你所看到的,我們不會加載任何復雜的東西,除了全局的依賴。不同于加載控制器,我們只加載路由配置。

// app.js

'use strict';

export default require('angular')

.module('lazyApp', [

require('angular-ui-router'),

require('oclazyload'),

require('./pages/home/home.routing').name,

require('./pages/messages/messages.routing').name,

]);

路由配置

所有的延遲加載都在路由配置中實現。正如我所說,我們正在使用 AngularUI Router ,因為我們需要實現嵌套視圖。我們有幾個使用案例。我們可以加載整個模塊(包括子狀態控制器)或每個 state 加載一個控制器(不去考慮對父級 state 的依賴)。

加載整個模塊

當用戶輸入 /home 路徑,瀏覽器就會下載 home 模塊。它包括兩個控制器,針對 home 和 home.about 這兩個state。我們通過 state 的配置對象中的 resolve 屬性就可以實現延遲加載。得益于 Webpack 的 require.ensure 方法,我們可以把 home 模塊創建成第一個代碼塊。它就叫做 1.bundle.js 。如果沒有 $ocLazyLoad.load ,我們會發現得到一個錯誤 Argument 'HomeController' is not a function, got undefined ,因為在 Angular 的設計中,啟動應用之后再加載文件的方式是不可行的。 但是 $ocLazyLoad.load 使得我們可以在啟動階段注冊一個模塊,然后在它加載完之后再去使用它。

// home.routing.js

'use strict';

function homeRouting($urlRouterProvider, $stateProvider) {

$urlRouterProvider.otherwise('/home');

$stateProvider

.state('home', {

url: '/home',

template: require('./views/home.html'),

controller: 'HomeController as vm',

resolve: {

loadHomeController: ($q, $ocLazyLoad) => {

return $q((resolve) => {

require.ensure([], () => {

// load whole module

let module = require('./home');

$ocLazyLoad.load({name: 'home'});

resolve(module.controller);

});

});

}

}

}).state('home.about', {

url: '/about',

template: require('./views/home.about.html'),

controller: 'HomeAboutController as vm',

});

}

export default angular

.module('home.routing', [])

.config(homeRouting);

控制器被當作是模塊的依賴。

// home.js

'use strict';

export default angular

.module('home', [

require('./controllers/home.controller').name,

require('./controllers/home.about.controller').name

]);

僅加載控制器

我們所做的是向前邁出的第一步,那么我們接著進行下一步。這一次,將沒有大的模塊,只有精簡的控制器。

// messages.routing.js

'use strict';

function messagesRouting($stateProvider) {

$stateProvider

.state('messages', {

url: '/messages',

template: require('./views/messages.html'),

controller: 'MessagesController as vm',

resolve: {

loadMessagesController: ($q, $ocLazyLoad) => {

return $q((resolve) => {

require.ensure([], () => {

// load only controller module

let module = require('./controllers/messages.controller');

$ocLazyLoad.load({name: module.name});

resolve(module.controller);

})

});

}

}

}).state('messages.all', {

url: '/all',

template: require('./views/messages.all.html'),

controller: 'MessagesAllController as vm',

resolve: {

loadMessagesAllController: ($q, $ocLazyLoad) => {

return $q((resolve) => {

require.ensure([], () => {

// load only controller module

let module = require('./controllers/messages.all.controller');

$ocLazyLoad.load({name: module.name});

resolve(module.controller);

})

});

}

}

})

我相信在這里沒有什么特別的,規則可以保持不變。

加載視圖(Views)

現在,讓我們暫時放開控制器而去關注一下視圖。正如你可能已經注意到的,我們把視圖嵌入到了路由配置里面。如果我們沒有把里面所有的路由配置放進 bundle.js ,這就不會是一個問題,但現在我們需要這么做。這個案例不是要延遲加載路由配置而是視圖,那么當我們使用 Webpack 來實現的時候,這會非常簡單。

// messages.routing.js

...

.state('messages.new', {

url: '/new',

templateProvider: ($q) => {

return $q((resolve) => {

// lazy load the view

require.ensure([], () => resolve(require('./views/messages.new.html')));

});

},

controller: 'MessagesNewController as vm',

resolve: {

loadMessagesNewController: ($q, $ocLazyLoad) => {

return $q((resolve) => {

require.ensure([], () => {

// load only controller module

let module = require('./controllers/messages.new.controller');

$ocLazyLoad.load({name: module.name});

resolve(module.controller);

})

});

}

}

});

}

export default angular

.module('messages.routing', [])

.config(messagesRouting);

當心重復的依賴

讓我們來看看 messages.all.controller 和 messages.new.controller 的內容。

// messages.all.controller.js

'use strict';

class MessagesAllController {

constructor(msgStore) {

this.msgs = msgStore.all();

}

}

export default angular

.module('messages.all.controller', [

require('commons/msg-store').name,

])

.controller('MessagesAllController', MessagesAllController);

// messages.all.controller.js

'use strict';

class MessagesNewController {

constructor(msgStore) {

this.text = '';

this._msgStore = msgStore;

}

create() {

this._msgStore.add(this.text);

this.text = '';

}

}

export default angular

.module('messages.new.controller', [

require('commons/msg-store').name,

])

.controller('MessagesNewController', MessagesNewController);

我們的問題的根源是 require('commons/msg-store').name 。它需要 msgStore 這一個服務,來實現控制器之間的消息共享。此服務在兩個包中都存在。在 messages.all.controller 中有一個,在 messages.new.controller 中又有一個。現在,它已經沒有任何優化的空間。如何解決呢?只需要把 msgStore 添加為應用模塊的依賴。雖然這還不夠完美,在大多數情況下,這已經足夠了。

// app.js

'use strict';

export default require('angular')

.module('lazyApp', [

require('angular-ui-router'),

require('oclazyload'),

// msgStore as global dependency

require('commons/msg-store').name,

require('./pages/home/home.routing').name,

require('./pages/messages/messages.routing').name,

]);

單元測試的技巧

把 msgStore 改成是全局依賴并不意味著你應該從控制器中刪除它。如果你這樣做了,在你編寫測試的時候,如果沒有模擬這一個依賴,那么它就無法正常工作了。因為在單元測試中,你只會加載這一個控制器而非整個應用模塊。

// messages.all.controller.spec.js

'use strict';

describe('MessagesAllController', () => {

var controller,

msgStoreMock;

beforeEach(angular.mock.module(require('./messages.all.controller').name));

beforeEach(inject(($controller) => {

msgStoreMock = require('commons/msg-store/msg-store.service.mock');

spyOn(msgStoreMock, 'all').and.returnValue(['foo', ]);

controller = $controller('MessagesAllController', { msgStore: msgStoreMock });

}));

it('saves msgStore.all() in msgs', () => {

expect(msgStoreMock.all).toHaveBeenCalled();

expect(controller.msgs).toEqual(['foo', ]);

});

});

以上內容是小編給大家分享的Webpack 實現 AngularJS 的延遲加載,希望對大家有所幫助!

更多信息請查看網絡編程
易賢網手機網站地址:Webpack 實現 AngularJS 的延遲加載
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
欧美一区二区三区视频免费播放| 亚洲欧美中文字幕| 亚洲夜间福利| 国产精品区一区二区三| 亚洲欧美在线播放| 国产一区二区三区不卡在线观看 | 玖玖国产精品视频| 一本久久知道综合久久| 国产精品视频精品| 亚洲欧美综合v| 影音先锋欧美精品| 欧美日韩性视频在线| 亚洲一区久久久| 亚洲国产影院| 国产在线不卡精品| 欧美午夜无遮挡| 麻豆av一区二区三区| 亚洲欧美日韩综合一区| 日韩亚洲成人av在线| 尤物九九久久国产精品的分类| 欧美激情一区在线| 美女诱惑黄网站一区| 欧美一级免费视频| 亚洲中字在线| 亚洲国产精品va在线看黑人动漫| 国产午夜亚洲精品理论片色戒| 欧美噜噜久久久xxx| 久热精品视频在线观看| 久久精品国产清高在天天线 | 国产精品久久久久9999| 久久精品国产亚洲5555| 欧美在线视频日韩| 久久成人久久爱| 久久午夜精品| 亚欧成人在线| 国产精品青草久久| 久久久夜夜夜| 久久久xxx| 久久久五月天| 麻豆国产精品一区二区三区| 欧美中文在线字幕| 久久久久久久激情视频| 久久精品夜夜夜夜久久| 久久三级福利| 欧美电影在线| 欧美精品在线一区| 欧美日韩一区二区三区在线视频| 欧美成人在线免费视频| 老司机午夜免费精品视频| 欧美一区二区三区日韩视频| 久久久久国产精品麻豆ai换脸| 欧美亚洲一区二区在线| 亚洲视频免费| 欧美在线观看视频在线| 久久免费视频网| 欧美成在线观看| 欧美日韩1080p| 欧美先锋影音| 国产一区99| 亚洲三级观看| 日韩视频在线你懂得| 亚洲综合丁香| 欧美大片一区| 欧美日韩精品欧美日韩精品 | 国产欧美一区二区色老头| 国产伦精品一区二区三区视频孕妇| 国产精品永久在线| 亚洲国产成人一区| 亚洲欧美日韩国产综合精品二区| 久久久福利视频| 欧美精品亚洲二区| 国产一区二区三区久久精品| 亚洲人体偷拍| 欧美在线你懂的| 欧美视频手机在线| 国产无一区二区| 日韩一级视频免费观看在线| 久久久久天天天天| 亚洲第一中文字幕| 美女免费视频一区| 91久久午夜| 欧美日韩精品在线播放| 国产最新精品精品你懂的| 香蕉久久夜色精品| 国内欧美视频一区二区| 久久综合色天天久久综合图片| 国产综合在线看| 欧美黄色网络| 亚洲视频综合| 在线观看国产欧美| 欧美巨乳在线观看| 一区二区三区四区蜜桃| 欧美日韩一区在线观看视频| 一区二区国产在线观看| 欧美日韩综合一区| 最新中文字幕亚洲| 亚洲图片在线| 国产精品一区二区黑丝| 久久综合九色| 一区二区三区免费观看| 免费国产一区二区| 亚洲大片免费看| 欧美精品在线免费观看| 亚洲天堂av综合网| 亚洲国产成人久久| 国产精品久久激情| 欧美在线播放视频| 国产精品揄拍500视频| 欧美二区在线| 亚洲国产成人久久综合| 欧美日韩国产123| 亚洲尤物在线视频观看| 伊人久久亚洲影院| 欧美先锋影音| 久久久久久国产精品mv| 99热这里只有精品8| 国产原创一区二区| 欧美日韩在线免费观看| 欧美mv日韩mv国产网站| 久久精品国产91精品亚洲| 制服诱惑一区二区| 亚洲国产天堂网精品网站| 国产一区久久| 国产一区二区高清不卡| 国产精品久久久久7777婷婷| 久久久之久亚州精品露出| 亚洲欧美乱综合| 亚洲免费观看高清在线观看 | 国产人成一区二区三区影院| 久久国产乱子精品免费女| 欧美一级片一区| 99视频有精品| 99精品国产在热久久| 最新成人av网站| 亚洲国产精品久久久久秋霞影院| 狠狠久久婷婷| 亚洲精品国产拍免费91在线| 在线免费日韩片| 狠狠88综合久久久久综合网| 久久夜色精品国产欧美乱| 久久久久久色| 国产一区白浆| 日韩视频中文字幕| 亚洲午夜精品久久久久久浪潮| 日韩午夜激情| 亚洲四色影视在线观看| 亚洲高清在线视频| 伊人精品成人久久综合软件| 一本色道久久综合狠狠躁篇怎么玩 | 国产精品丝袜xxxxxxx| 欧美二区在线观看| 久久精品五月| 欧美电影专区| 国产精品乱码妇女bbbb| 欧美精品大片| 国产精品无码永久免费888| 国产美女精品视频| 亚洲欧洲在线看| 欧美一区二区三区另类| 免费精品99久久国产综合精品| 久久久不卡网国产精品一区| 国产精品久久久久久影院8一贰佰| 国产一区二区av| 亚洲午夜久久久| 欧美精品日韩一区| 亚洲欧洲精品一区二区三区波多野1战4 | 久久久久久九九九九| 欧美日韩 国产精品| 亚洲电影激情视频网站| 久久国产免费| 极品尤物av久久免费看| 亚洲一区二区三区午夜| 中文欧美字幕免费| 久久精品99国产精品酒店日本| 欧美在线视频观看免费网站| 国产精品ⅴa在线观看h| 亚洲一区二区三区在线看| 欧美精品午夜视频| 亚洲国产精品悠悠久久琪琪 | 欧美日韩一区二区在线播放| 国产午夜精品在线观看| 欧美人与性动交a欧美精品| 亚洲日本成人网| 裸体素人女欧美日韩| 亚洲电影免费观看高清完整版在线观看 | 正在播放欧美一区| 国产精品av久久久久久麻豆网| 国产精品99久久久久久久久| 欧美日韩一区二区三区在线 | 亚洲网在线观看| 欧美精品一区二区三区久久久竹菊| 亚洲国产精品久久人人爱蜜臀| 免费成人小视频| 亚洲一本大道在线| 国产精品进线69影院| 美国十次成人| 亚洲午夜精品久久| 亚洲国产高清自拍| 欧美视频在线视频| 久久久天天操|