如今你不會React/Vue都很差意思說本身是前端,不過我相信不少前端項目仍是基於jquery類庫的傳統模式的,假如你有追求的態度使用過requireJs這個庫,你必定思考過一個問題,或者說一種組件化的雛形思惟,那就是運用一個模板引擎如artTemplate+requireJs實現一個單頁面組件化的開發模式(spa)css
這是近段時間作的一箇中後臺系統的基本目錄結構,就是使用上述的模式。如圖所示:其中index.html爲網頁惟一入口,其餘每個頁面均對應一個tpl+css+js,頁面跳轉均經過require['xx',cb]實現,看上去好像其實也挺好的,簡單、快捷,那麼這樣的模式有個很大的問題就是不產生瀏覽記錄,頁面沒法後退!沒法單獨刷新!因此,應運而生,是時候給他賦予路由功能了html
在頁面跳轉的時候使用history.pushState(stateObject, title, url)改變url的hash值(如:#....),一般狀況是預先配置好的路由key,這個時候會觸發window.onhashchange事件,回調函數裏執行業務邏輯並最終控制頁面的跳轉,這樣一來就基本達到了路由的能力。同時再配合window.onpopstate事件,當頁面後退時觸發,進行相關的邏輯控制。前端
var roleid = 2; router.config({ view: '.module-container', //渲染模板的dom baseUrl: '/', //資源根路徑 router: { 'page-test1': { templateUrl: 'tpl/test/test1.tpl', //模板或頁面地址 controller: 'js/test/test1.js', //頁面對應的js role: [1, 2] //能訪問頁面的角色id }, 'page-test2': { templateUrl: 'tpl/test/test2.tpl', controller: 'js/test/test2.js', role: 1 }, 'page-test3': { controller: 'js/test/test3.js', role: 2 }, 'defaults': 'page-test1' //默認路由 }, errorTplId: '#errorTpl', //可選的錯誤模板,用來處理加載html模塊異常時展現錯誤內容 enterCallback: function (routeObj) { //回車鍵後的回調函數,一般可作頁面權限控制、數據統計等等 console.log('enterCallback') if (!routeObj.url) return; if (typeof routeObj.role == 'object') { var notLook = false; for (var i = 0; i < routeObj.role.length; i++) { if (routeObj.role[i] == roleid) { notLook = true; break; } } if (!notLook) { router.isNotLook = false; alert('無權訪問') } else { router.isNotLook = true; } } else { if (routeObj.role != roleid) { router.isNotLook = false; alert('無權訪問') } else { router.isNotLook = true; } } } });
router.to('page-test1', { 'test1': '我是帶過來的參數' }) router.getUrlParameter('test1')
router.setParam({ 'test1': '我是帶過來的參數,不顯示在url上哦' }) router.to('page-test1'); router.getParam('test1')
傳送門jquery
傳送門webpack