摘要:減少服務器的請求對于和這兩個特殊寫發的文件因為的打包不識別,要進行特殊處理
上一節提完了構思和大體實現下面來看具體的
配置文件config配置文件主要是是用來讓后端開發自主添加頁面,并通過該配置生成route和加載對應的store,這樣就省去了后端去了解vue-router和vuex的用法了;
配置文件格式如下
這里采用umd格式開頭是為了后續nodejs進行調用
(function(global, factory) { typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() : (global.__config__ = factory()); })(this, function() { var __config__ = { //規則說明 /** * route : 路由 * path : 模塊路徑 * store : 是否加載對應store * sync : 是否同步加載 */ modules: [ { route: "/", path: "Login", store: true, sync:true }, { route: "/Main", path: "Main" }, ... ] } });路由router
有了上面的config文件,我們就可以通過配置來來生成router了
代碼如下
在define前根據config動態define一些模塊用來給業務模塊動態返回template和mixin一些公用方法
; (function () { var businessModules = ["vue", "store/index", "vue-router"].concat(__config__.map(function (o) { var module = o .route .replace(//:[^/]*/g, "") .replace(///g, "_") if (o.sync) { var func = ";define("business/base/" + module + "",["__module__","business/" + o.path + "/index","text!business/" + o.path + "/tpl.html"],function(factory,businessModule,template){ return factory("" + module + "", businessModule("" + module + ""),template)})" __config__.dynamic(func) return "business/base/" + module } })) define(businessModules, function (Vue, store, VueRouter) { Vue.use(VueRouter) var m = [] .slice .call(arguments, 3) var routes = __config__.map(function (o, i) { var clone = Object.assign({}, o) clone.name = clone .route .replace(//:[^/]*/g, "") .replace(///g, "_") delete clone.store clone.path = clone.route delete clone.route clone.component = clone.sync ? m[i] : function (resolve) { require(["__module__", "business/" + o.path + "/index", "text!business/" + o.path + "/tpl.html"], function (factory, businessModule, template) { resolve(factory(clone.name, businessModule(clone.name), template)) }) } return clone }) var router = new VueRouter({mode: "hash", routes: routes}) var firstLoad = true var goto = function (to, from, next) { var tName = to.name || "_" var fName = from.name || "_" var toDepth = tName .split("_") .length var fromDepth = fName .split("_") .length toDepth += (tName === "_" ? -1 : 0) fromDepth += (fName === "_" ? -1 : 0) var direction = toDepth - fromDepth if (firstLoad && toDepth > 0) { firstLoad = false next({path: "/"}) } else { store.dispatch("transition", { direction: direction, to: tName, from: fName }) window.setTimeout(function () { next() }) firstLoad = false } } router.beforeEach(function (to, from, next) { var args = arguments if (to.path === "/") { goto.apply(this, args) return } store .dispatch("auth") .then(function () { goto.apply(this, args) }, function () { Vue.$toast({message: "驗證信息已失效,請重新登陸", iconClass: "fa fa-close"}) window.setTimeout(function () { next({path: "/"}) }) }) }) return {tpl: "狀態管理store", router: router} }) })()
在define前根據config動態define一些模塊用來給store對象添加一些公用getter,mutations和action
(function() { var storeModules = [ "vue", "vuex", "./transition" ].concat(__config__.modules.map(function(o) { var module = o.route.replace(///g, "_"); var func = (o.store == true ? ";define("store/modules/base/" + module + "",["__store__factory__","store/modules/" + o.path + "/store"],function(factory,storeModule){ var mb = factory("" + module + ""); var m = new storeModule("" + module + ""); var c = $.extend(true,{},mb, m); return c; });" : ";define("store/modules/base/" + module + "",["__store__factory__"],function(factory){ return factory("" + module + "");});"); __config__.dynamic(func); return "store/modules/base/" + module; })); define(storeModules, function(Vue, Vuex, transition) { Vue.use(Vuex); var m = [].slice.call(arguments, 3); var modules = {}; __config__.each(function(o, i) { modules[o.route.replace(///g, "_")] = m[i]; }); return new Vuex.Store({ state: {}, mutations: {}, actions: { transition: transition }, modules: modules }) }) })();vue主程序定義
define([ "vue", "vue-router", "store/index", "router/index", "emitter", "__install__" //這里面主要是對公用控件的一些初始化 Vue.component({...}) ], function(Vue, VueRouter, store, router, Emitter) { window.Vue = Vue; return { run: function() { Vue.config.silent = false; Vue.config.devtools = true; Vue.mixin(Emitter); var $vm = new Vue({ el: "body > div", store: store, template: router.tpl, router: router.router }); } } })模塊業務的寫法
以Login模塊為例
文件路徑/business/Login/index.js
同目錄下還有個tpl.html
define(["vue", "vuex"], function(Vue, Vuex) { return function module(moduleName) { return { data: function() { return { username: "", password: "" } }, methods: Object.assign( Vuex.mapActions([ "verify" ]), { sign: function() { var that = this; this.verify({ username: this.username, password: this.password }).then(function() { that.$router.push("/Main"); }, function(mes) { Vue.$toast({ message: mes || "帳號或者密碼錯誤", iconClass: "fa fa-close" }); }); } }) } } })
對應的store
文件為/store/module/Login/store.js
define(function() { return function storeModule(module) { this.state = { sign: true, auth: "" //用于存儲登陸成功后的驗證碼,用于后繼登陸狀態驗證 } this.getters = { isLogin: function(state) { return state.sign; } } this.mutations = { success: function(state, param) { state.sign = true; state.auth = param ? param : state.auth; }, fail: function(state) { state.sign = false; state.auth = ""; } } this.actions = { //頁面跳轉過程中驗證用 verify: function(content, opt) { return new Promise(function(resolve, reject) { $.post("/api/verify", { username: opt.username, password: opt.password }).then(function(data) { if (data.state) { content.commit("success", data.auth); resolve(); } else { content.commit("fail"); reject(); } }, function() { content.commit("fail"); reject("服務器錯誤!請聯系管理員"); }); }) }, //登陸用 auth: function(content) { return new Promise(function(resolve, reject) { $.get("/api/auth", { auth: content.state.auth }).then(function(data) { if (data) { content.commit("success"); resolve(data); } else { content.commit("fail"); reject(); } }); }); } } } })
平時后端開發時不涉及全局狀態控制時就可以不用store,ajax可以直接寫在模塊內
以上就是基于requirejs的vue2項目的核心內容
該項目在不打包的情況下能夠正常運行,各模塊都會在頁面加載時進行預加載;后繼還將進行所有文件打。減少服務器的請求對于store和router這兩個特殊寫發的文件(因為requirejs的r.js打包不識別),要進行特殊處理
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86793.html
摘要:項目截圖項目演示地址該項目主要是解決如何讓不了解前端構建,并負責大部分業務邏輯的后端開發出一個單頁應用覺得有用請給個推薦,謝謝最近做了一次小更新配置文件可以配置模塊是否異步加載以及是否關聯開發背景公司推進手機端項目,但目前開發模式依舊是后端 項目截圖 項目演示地址 該項目主要是解決: 如何讓不了解前端構建,并負責大部分業務邏輯的后端 開發出 一個單頁應用 覺得有用請給個推薦,謝謝 最近...
摘要:這里是打包篇使用的是的進行打包思路是通過里面的進行項目的初打包因為和里面的引用是動態生成的所以無法對其進行處理這里我們用到了來進行文件整合具體看代碼這里是通過配置文件來組裝配置信息對設置了同步的模板進行打包這里是通過 這里是打包篇 使用的是requirejs的r.js進行打包 思路是,通過entrance.js里面的require.config進行項目的初打包 因為router.js和...
摘要:特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 本以為自己收藏的站點多,可以很快搞定,沒想到一入匯總深似海。還有很多不足&遺漏的地方,歡迎補充。有錯誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應和斧正,會及時更新,平時業務工作時也會不定期更...
摘要:是目前唯一一個支持同步調用的跨平臺年度上最多的個項目前端掘金年接近尾聲,在最近的幾篇文章中,會整理總結一些年度開源項目。 JS 全棧教程 - 前端 - 掘金本課程是基于阮一峰的 js 全棧教程的視頻版本,免費供大家觀看... 2016 年 10 個最佳的 CodePen 作品 - 前端 - 掘金說到 CodePen,前端開發者們肯定不會陌生。如果說 Dribbble 是設計師們聚集的圣...
摘要:哪吒別人的看法都是狗屁,你是誰只有你自己說了才算,這是爹教我的道理。哪吒去他個鳥命我命由我,不由天是魔是仙,我自己決定哪吒白白搭上一條人命,你傻不傻敖丙不傻誰和你做朋友太乙真人人是否能夠改變命運,我不曉得。我只曉得,不認命是哪吒的命。 showImg(https://segmentfault.com/img/bVbwiGL?w=900&h=378); 出處 查看github最新的Vue...
閱讀 2033·2023-04-25 23:30
閱讀 1455·2021-11-24 10:18
閱讀 3079·2021-10-09 09:54
閱讀 2021·2021-10-08 10:05
閱讀 3438·2021-09-23 11:21
閱讀 3165·2019-08-30 15:52
閱讀 1563·2019-08-30 13:05
閱讀 1061·2019-08-30 13:02