左右不逢缘 发表于 2023-12-25 07:30:44

DQ(v3.0.220723)网页加载速度优化 New

大家有没有发现一个问题:

setTimeout(function() {      var appid = '';      var channelname = window.location.hostname;      if (!!window.navigator.userAgent.match(/AppleWebKit.*Mobile.*/)) {          appid = '500D36509CE649E88446FB4E7A51B221'; // h5      } else {          appid = '4F323A1D5F444BF69C7C4E10704AEA2F'; // pc      }      var url = 'http://sdk.talkingdata.com/app/h5/v1?appid=' + appid + '&vn=' + 'v3.0.220113' + '&vc=' + 'v3.0.220113' + '&td_channelid=' + channelname;      if ( window.location.protocol.indexOf('https') != -1 ) {          url = 'https://jic.talkingdata.com/app/h5/v1?appid=' + appid + '&vn=' + 'v3.0.220113' + '&vc=' + 'v3.0.220113' + '&td_channelid=' + channelname;      }      var talkingdata = document.createElement('script');      talkingdata.type = 'text/javascript';      talkingdata.async = true;      talkingdata.src = url;      document.getElementsByTagName('body').appendChild(talkingdata);      window.sessionStorage.setItem('__TD_td_channel', window.location.hostname.replace(/./g, '_'));      var tdjs = document.createElement('script');      tdjs.type = 'text/javascript';      tdjs.async = true;      tdjs.src = 'https://jic.talkingdata.com/app/h5/v1?appid=750AEE91CF4446A19A2D12D5EE32F725';      document.getElementsByTagName('body').appendChild(tdjs);      var dzqjs = document.createElement('script');      dzqjs.type = 'text/javascript';      dzqjs.async = true;      dzqjs.src = '/js/dzq.js';      document.getElementsByTagName('body').appendChild(dzqjs);      }, 2000);这个引用有153个,涉及文件78个
仔细阅读发现,这个function 是判断客户端的浏览器类型,以及针对不同浏览器创建不同的js文件


试想一下,如果离线或者网络不通情况下,是不是会延迟网络加载速度,虽然代码里写的是异步访问,但是随着时间的推移,网络后台缓存会不断尝试连接并报错!


不知道开发者当时的设计思路,为什么不调用本地的js呢? 而且78个文件中都有这个调用,为什么不引用一个公共函数?


昨天我翻电脑,找到了官方最后一个版本的安装包,尝试修改了其中的js文件调用,现在只有上面代码中提到的2个链接,经过试验发现,正常安装,而且页面打开速度很快


刚刚尝试把代码中的js文件保存到本地,修改成本地调用后,现在打开首页速度稳定在0.05秒,可怕不?


对了还有一个大家不知道的代码:
img.src = "https://discuzq-0gxi1bn2969fa48d.service.tcloudbase.com/access?" + pt + "&dn=" + encodeURIComponent(window.location.hostname.replace(/\./g, "_"));这个是引用的图片,居然是一个点,每次开页面都回访问,不知道官方是统计访问次数还是? 不得而知。

还是那句话,接触discuz已经10多年了,没有感情是不可能的,虽然DQ停止了维护,但是不能把摊子直接甩掉吧? 很伤感情。

浅生 发表于 2023-12-25 07:31:39

http://sdk.talkingdata.com/app/h5/v1?appid=4F323A1D5F444BF69C7C4E10704AEA2F&vn=v3.0.220113&vc=v3.0.220113&td_channelid=127.0.0.1http://sdk.talkingdata.com/app/h5/v1?appid=500D36509CE649E88446FB4E7A51B221&vn=v3.0.220113&vc=v3.0.220113&td_channelid=127.0.0.1访问上面这个地址会返回这个:
var appid = '500D36509CE649E88446FB4E7A51B221';var vn = 'v3.0.220113';var vc = 'v3.0.220113';var TDBaseUrl = 'http://sdk.talkingdata.com/app/h5/v1/websdk';var TDRequestUrl = 'http://h5data.talkingdata.net/app/v1';function createScriptTd(url) {    var _head = document.getElementsByTagName('head');    var _script = document.createElement('script');    _script.type = 'text/javascript';    _script.src = url;    _head.appendChild(_script)};createScriptTd(TDBaseUrl + '/js/sdk_release.js');if (!window['JSON'] || typeof JSON !== 'object') {    createScriptTd(TDBaseUrl + '/js/json2.js')};window["TDAPP"] = {};window["TDAPP"].onEvent = function (id, label, params) {    if (arguments.length > 0) {      try {            var opts = {                count: 1,                start: new Date().getTime()            };            if (id != undefined) {                opts["id"] = typeof id != "string" ? JSON.stringify(id) : id            }            if (label != undefined) {                opts["label"] = typeof label != "string" ? JSON.stringify(label) : label            } else {                opts["label"] = ""            }            if (params != undefined) {                var isJson = function (obj) {                  var isjson = typeof(obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "" && !obj.length;                  return isjson                };                if (isJson(params)) {                  opts["params"] = params                } else {                  opts["params"] = {                        params: ""                  }                }            }            var eventName = "__TD_td-init-event";            var ev = localStorage;            if (ev) {                var ca = JSON.parse(ev);                ca.push(opts);                localStorage.setItem(eventName, JSON.stringify(ca));                return            };            localStorage.setItem(eventName, "[" + JSON.stringify(opts) + "]")      } catch (e) {}    }};

注意上述代码中会执行创建以下js文件:
TDRequestUrl=http://h5data.talkingdata.net/app/v1

TDBaseUrl=http://sdk.talkingdata.com/app/h5/v1/


http://sdk.talkingdata.com/app/h5/v1/websdk/js/sdk_release.js
http://sdk.talkingdata.com/app/h5/v1/websdk/js/js/json2.js

经过合并后会得到sdk_release.js, 那么是否可以在此处直接根据条件 引用本地js呢?


同理访问:
https://jic.talkingdata.com/app/h5/v1?appid=750AEE91CF4446A19A2D12D5EE32F725会返回:
var appid = '750AEE91CF4446A19A2D12D5EE32F725';var vn = '';var vc = '';var TDBaseUrl = 'https://jic.talkingdata.com/app/h5/v1/websdk';var TDRequestUrl = 'https://h5.udrig.com/app/v1';function createScriptTd(url) {    var _head = document.getElementsByTagName('head');    var _script = document.createElement('script');    _script.type = 'text/javascript';    _script.src = url;    _head.appendChild(_script)};createScriptTd(TDBaseUrl + '/js/sdk_release.js');if (!window['JSON'] || typeof JSON !== 'object') {    createScriptTd(TDBaseUrl + '/js/json2.js')};window["TDAPP"] = {};window["TDAPP"].onEvent = function (id, label, params) {    if (arguments.length > 0) {      try {            var opts = {                count: 1,                start: new Date().getTime()            };            if (id != undefined) {                opts["id"] = typeof id != "string" ? JSON.stringify(id) : id            }            if (label != undefined) {                opts["label"] = typeof label != "string" ? JSON.stringify(label) : label            } else {                opts["label"] = ""            }            if (params != undefined) {                var isJson = function (obj) {                  var isjson = typeof(obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "" && !obj.length;                  return isjson                };                if (isJson(params)) {                  opts["params"] = params                } else {                  opts["params"] = {                        params: ""                  }                }            }            var eventName = "__TD_td-init-event";            var ev = localStorage;            if (ev) {                var ca = JSON.parse(ev);                ca.push(opts);                localStorage.setItem(eventName, JSON.stringify(ca));                return            };            localStorage.setItem(eventName, "[" + JSON.stringify(opts) + "]")      } catch (e) {}    }};
似乎和上面的代码一样,一个是http协议 一个是https协议
最终都是获取sdk_release.js 文件:
!function () {    "use strict";    var _ = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) {      return typeof e    }   : function (e) {      return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e    },    c = function (c) {      var d,      u,      a = 0,      s = c.document,      l = /^(?:text|application)\/javascript/i,      p = /^(?:text|application)\/xml/i,      f = "application/json",      g = "text/html",      m = /^\s*$/,      v = function e(t) {            var o = A({}, t || {});            for (d in e.settings)                void 0 === o && (o = e.settings);            (n = o).global && 0 == v.active++ && S(n),            o.crossDomain || (o.crossDomain = /^([\w-]+:)?\/\/([^\/]+)/.test(o.url) && RegExp.$2 != c.location.host);            var r = o.dataType,            t = /=\?/.test(o.url);            if ("jsonp" == r || t)                return t || (o.url = P(o.url, "callback=?")), e.JSONP(o);            o.url || (o.url = c.location.toString()),            D(o);            var i,            n = o.accepts,            t = {},            a = /^([\w-]+:)\/\//.test(o.url) ? RegExp.$1 : c.location.protocol,            s = e.settings.xhr();            o.crossDomain || (t["X-Requested-With"] = "XMLHttpRequest"),            n && (-1 < (t.Accept = n).indexOf(",") && (n = n.split(",", 2)), s.overrideMimeType && s.overrideMimeType(n)),            (o.contentType || o.data && "GET" != o.type.toUpperCase()) && (t["Content-Type"] = o.contentType || "application/x-www-form-urlencoded"),            o.headers = A(t, o.headers || {}),            s.onreadystatechange = function () {                if (4 == s.readyState) {                  clearTimeout(i);                  var e,                  t = !1;                  if (200 <= s.status && s.status < 300 || 304 == s.status || 0 == s.status && "file:" == a) {                        r = r || ((n = s.getResponseHeader("content-type")) && (n == g ? "html" : n == f ? "json" : l.test(n) ? "script" : p.test(n) && "xml") || "text"),                        e = s.responseText;                        try {                            "script" == r ? (0, eval)(e) : "xml" == r ? e = s.responseXML : "json" == r && (e = m.test(e) ? null : JSON.parse(e))                        } catch (e) {                            t = e                        }                        t ? y(t, "parsererror", s, o) : T(e, s, o)                  } else                        y(null, "error", s, o)                }                var n            };            t = !("async" in o) || o.async;            for (u in s.open(o.type, o.url, t), o.headers)                s.setRequestHeader(u, o.headers);            return !1 === function (e, t) {                var n = t.context;                if (!1 === t.beforeSend.call(n, e, t) || !1 === S(t))                  return !1;                S(t)            }            (s, o) ? (s.abort(), !1) : (0 < o.timeout && (i = setTimeout(function () {                        s.onreadystatechange = w,                        s.abort(),                        y(null, "timeout", s, o)                  }, o.timeout)), s.send(o.data || null), s)      };      function S(e) {            if (e.global)                return !0      }      function T(e, t, n) {            var o = n.context,            r = "success";            n.success.call(o, e, r, t),            S(n),            h(r, t, n)      }      function y(e, t, n, o) {            var r = o.context;            o.error.call(r, n, t, e),            S(o),            h(t, n, o)      }      function h(e, t, n) {            var o = n.context;            n.complete.call(o, t, e),            S(n),            (n = n).global && !--v.active && S(n)      }      function w() {}      function P(e, t) {            return (e + "&" + t).replace(/[&?]{1,2}/, "?")      }      function D(e) {            var t,            n,            o;            "object" === _(e.data) && (e.data = (t = e.data, (o = []).add = function (e, t) {                  this.push(r(e) + "=" + r(t))                }, function e(t, n, o, r) {                  var i = "array" == typeof n;                  for (var a in n) {                        var s = n;                        r && (a = o ? r : r + "[" + (i ? "" : a) + "]"),                        !r && i ? t.add(s.name, s.value) : (o ? "array" == typeof s : "object" === (void 0 === s ? "undefined" : _(s))) ? e(t, s, o, a) : t.add(a, s)                  }                }                  (o, t, n), o.join("&").replace("%20", "+"))),            !e.data || e.type && "GET" != e.type.toUpperCase() || (e.url = P(e.url, e.data))      }      v.active = 0,      v.JSONP = function (t) {            if (!("type" in t))                return v(t);            var n,            o = "jsonp" + ++a,            e = s.createElement("script"),            r = {                abort: function () {                  o in c && (c = w),                  h("abort", r, t)                }            },            i = s.getElementsByTagName("head") || s.documentElement;            return t.error && (e.onerror = function () {                r.abort(),                t.error()            }),            c = function (e) {                clearTimeout(n),                delete c,                T(e, r, t)            },            D(t),            e.src = t.url.replace(/=\?/, "=" + o),            i.insertBefore(e, i.firstChild),            0 < t.timeout && (n = setTimeout(function () {                  r.abort(),                  h("timeout", r, t)                }, t.timeout)),            r      },      v.settings = {            type: "GET",            beforeSend: w,            success: w,            error: w,            complete: w,            context: null,            global: !0,            xhr: function () {                return new c.XMLHttpRequest            },            accepts: {                script: "text/javascript, application/javascript",                json: f,                xml: "application/xml, text/xml",                html: g,                text: "text/plain"            },            crossDomain: !1,            timeout: 0      },      v.get = function (e, t) {            return v({                url: e,                success: t            })      },      v.post = function (e, t, n, o) {            return "function" == typeof t && (o = o || n, n = t, t = null),            v({                type: "POST",                url: e,                data: t,                success: n,                dataType: o            })      },      v.getJSON = function (e, t) {            return v({                url: e,                success: t,                dataType: "json"            })      };      var r = encodeURIComponent;      function A(t) {            return Array.prototype.slice.call(arguments, 1).forEach(function (e) {                for (d in e)                  void 0 !== e && (t = e)            }),            t      }      return {            ajax: v      }    }    (window),    u = {      deviceId: "",      appkey: appid || "",      appProfile: {            versionName: vn || "",            versionCode: vc || "",            initTime: "",            sdkVersion: "H5+APP+v1.0.6",            partner: ""      },      deviceProfile: {            pixel: "",            language: navigator.language,            timezone: (new Date).getTimezoneOffset() / 60 * -1      },      msgs: []    },    r = {      type: 2,      data: {            id: "",            start: 0,            duration: 0      }    },    l = {      autoTrack: !0    };    !function () {      for (var e = document.getElementsByTagName("script"), t = 0; t < e.length; t++) {            var n = e.getAttribute("td-autoTrack");            if ("false" === n || !1 === n) {                l.autoTrack = !1;                break            }      }    }    ();    var p = (new Date).getTime(),    e = function (e, t, n) {      e.addEventListener ? e.addEventListener(t, n, !1) : e.attachEvent ? e.attachEvent("on" + t, n) : e["on" + t] = n    };    function t(e, t, n) {      if (void 0 === t) {            var o = null;            if (document.cookie && "" != document.cookie)                for (var r = document.cookie.split(";"), i = 0; i < r.length; i++) {                  var a = r;                  if (a.substring(0, e.length + 1) == e + "=") {                        o = decodeURIComponent(a.substring(e.length + 1));                        break                  }                }            return o      }      n = n || {},      null === t && (t = "", n.expires = -1);      var s = "";      n.expires && ("number" == typeof n.expires || n.expires.toUTCString) && ("number" == typeof n.expires ? (d = new Date).setTime(d.getTime() + 24 * n.expires * 60 * 60 * 1e3) : d = n.expires, s = "; expires=" + d.toUTCString());      var c = n.path ? "; path=" + n.path : "",      d = n.domain ? "; domain=" + n.domain : "",      n = n.secure ? "; secure" : "";      document.cookie = .join("")    }    l.localStorage = {      add: function (e, t) {            this.addLocalStorage(e, t),            "sessionId" != e && this.addCookie(e, t)      },      get: function (e) {            var t = this.getLocalStorage(e);            return t || this._getCookie(e)      },      create: function () {            t("__TD_LOCAL") || (this._addCookie(""), window.localStorage)      },      addCookie: function (e, t) {            if (!window.localStorage) {                this.create();                var n = this.cookieList();                n = t;                var o,                r = [];                for (o in n)                  r.push(o + "=" + n);                this._addCookie(r.join(";"))            }      },      _setCookie: function () {            this.cookieList();            t("__TD_LOCAL", "", {                expires: 1095,                path: "/",                domain: location.hostname            })      },      _addCookie: function (e) {            t("__TD_LOCAL", e, {                expires: 1095,                path: "/",                domain: location.hostname            })      },      _getCookie: function (e) {            var t = this.cookieList();            if (t && t)                return t      },      delCookie: function (e) {},      cookieList: function () {            var e = t("__TD_LOCAL");            return this.format(e)      },      addLocalStorage: function (e, t) {            window.localStorage && ("sessionId" == e && window.sessionStorage ? sessionStorage.setItem("__TD_" + e, t) : localStorage["__TD_" + e] = t)      },      delLocalStorage: function (e) {            window.localStorage && localStorage.removeItem("__TD_" + e)      },      getLocalStorage: function (e) {            if (window.localStorage)                return "sessionId" == e && window.sessionStorage ? sessionStorage.getItem("__TD_" + e) : localStorage["__TD_" + e]      },      format: function (e) {            var t = {};            if (!e)                return t;            for (var n = e.split(";"), o = n.length, r = 0; r < o; r++) {                var i = n.split("=");                2 == i.length && (t] = i)            }            return t      }    },    l.sessionStorage = {      add: function (e, t) {            window.sessionStorage && sessionStorage.setItem("__TD_" + e, t)      },      get: function (e) {            return sessionStorage.getItem("__TD_" + e)      },      remove: function (e) {            sessionStorage.removeItem("__TD_" + e)      }    };    var d,    i,    a,    f,    n,    g = !0,    m = !1;    function v() {      this.url = TDRequestUrl,      this.opts = {},      this.requestArray = new Array    }    v.prototype = {      getAjax: function (o, r, i, a, s) {            (function (e) {                var t,                n;                0 < navigator.userAgent.indexOf("MSIE 9.0") ? "MSIE6.0" == (t = navigator.appVersion.split(";").replace(/[ ]/g, "")) || "MSIE7.0" == t ? alert("no support IE6,IE7") : window.XDomainRequest && ((n = new XDomainRequest) ? (e.error && "function" == typeof e.error && (n.onerror = function () {                            e.error()                        }), e.timeout && "function" == typeof e.timeout && (n.ontimeout = function () {                            e.timeout()                        }), e.success && "function" == typeof e.success && (n.onload = function () {                            e.dataType ? "json" == e.dataType.toLowerCase() && e.success(JSON.parse(n.responseText)) : e.success(n.responseText)                        }), n.open(e.type, e.url), n.send(e.param)) : alert("Failed to create XDomainRequest")) : g ? (S.add("td-unique", "true"), g = !1, d = c.ajax({                            type: o,                            url: r,                            data: JSON.stringify(i),                            dataType: "text",                            success: a,                            error: s,                            complete: function () {                              g = !(d = void 0),                              m && (T.getAjax(), m = !1),                              S.delLocalStorage("td-unique")                            }                        })) : m = !0            })({                url: this.url,                type: "POST",                param: JSON.stringify(i),                success: a            })      },      set: function (e, t, n) {            this.opts = e,            this.send(t, n)      },      send: function (e, t) {            this.getAjax("post", this.url, this.opts, e, t)      }    },    (i = window).TDBASE = i.TDBASE || {},    TDBASE.cacheName = "cacheList",    TDBASE.unique = function (e) {      e.sort();      for (var t = ], n = 1; n < e.length; n++)            e !== t && t.push(e);      return t    },    TDBASE.getArgs = function () {      for (var e = new Object, t = i.location.search.substring(1).split("&"), n = 0; n < t.length; n++) {            var o,            r = t.indexOf("=");            -1 != r && (o = t.substring(0, r), r = t.substring(r + 1), r = decodeURIComponent(r), e = r)      }      return e    },    TDBASE.getCommon = function (e) {      var t = S.get("appkey") ? S.get("appkey") : u.appkey,      e = {            deviceId: u.deviceId,            appkey: t,            appProfile: u.appProfile,            deviceProfile: u.deviceProfile,            msgs: e.msg      };      return u.appContext && (e.appContext = u.appContext),      e    },    TDBASE.getCommonMsg = function (e, t, n, o, r, i) {      return {            type: 2,            data: {                id: e,                start: t,                status: n,                duration: o || 0,                pages: i ? : [],                events: r || []            }      }    },    TDBASE.addSessionStart = function (e, t) {      S.add("lastSession", JSON.stringify({                id: r.data.id,                start: r.data.start            })),      n = (n = S.get("td-hold-event")) && JSON.parse(n);      var n = TDBASE.getCommonMsg(r.data.id, r.data.start, t, e, n);      TDBASE.addMsg(n),      S.delLocalStorage("td-hold-event")    },    TDBASE.equal = function (e, t) {      if ((void 0 === e ? "undefined" : _(e)) != (void 0 === t ? "undefined" : _(t)))            return !1;      if (_(e.length) != _(t.length))            return !1;      var n = !0,      o = [],      r = [];      for (i in e)            "count" === i || "start" === i || o.push(i);      for (i in t)            "count" === i || "start" === i || r.push(i);      if (o.length != r.length)            return !1;      for (var i = 0, a = r.length; i < a; i++)            o.push(r);      for (var s = TDBASE.unique(o), i = 0, a = s.length; i < a; i++) {            if (!(sin e && sin t))                return !1;            if ("object" == _(e]) && "object" == _(t]))                n = TDBASE.equal(e], t]);            else if (e] !== t])                return !1      }      return n    },    TDBASE.addGenre = function (e, t, n) {      if (S.get("sessionMsg")) {            n && n(e);            var n = JSON.parse(S.get("sessionMsg")),            o = n.msg.data;            if ("events" !== t)                o.push(e), S.add("sessionMsg", JSON.stringify(n));            else {                if (0 != o.length) {                  for (var r = !1, i = 0; i < o.length; i++)                        if (TDBASE.equal(o, e)) {                            r = !0,                            o.count += 1,                            o.start = e.start;                            break                        }                  r || o.push(e)                } else                  o.push(e);                S.add("sessionMsg", JSON.stringify(n))            }      }    },    TDBASE.lealSet = function (e) {      S.add("leavetime", e),      S.add("leaveSession", parseInt((e - s.get("SessionStart")) / 1e3))    },    TDBASE.addMsg = function (e) {      var t;      S.get("sessionMsg") ? ((t = JSON.parse(S.get("sessionMsg"))).msg.push(e), S.add("sessionMsg", JSON.stringify(t))) : S.add("sessionMsg", JSON.stringify({                msg:             }))    },    (a = {            currentPage: null,            pageStartTime: 0,            ref: "",            logoutCalled: !1,            init: function () {                e(window, "pagehide", a.pageLogout),                e(window, "beforeunload", a.pageLogout),                window.TDAPP = window.TDAPP || {},                window.TDAPP.onPage = a.onPage,                l.autoTrack && (a.currentPage = window.location.href, a.ref = document.referrer)            },            onPage: function (e) {                var t = (new Date).getTime();                a.pageLogout("force"),                a.pageEnter(e, a.currentPage, t),                a.ref = a.currentPage,                a.currentPage = e,                a.pageStartTime = t,                T.getAjax()            },            pageEnter: function (e, t, n) {                t = {                  name: e,                  start: n,                  duration: 0,                  refer: t || document.referrer                };                TDBASE.addGenre(t, "pages")            },            pageLogout: function (e) {                if ("force" !== e) {                  if (a.logoutCalled)                        return;                  a.logoutCalled = !0                }                var t = null,                n = 0,                o = null;                if (l.autoTrack)                  t = a.currentPage || window.location.href, n = a.pageStartTime || p, o = a.ref || document.referrer;                else {                  if (!a.currentPage)                        return;                  t = a.currentPage,                  n = a.pageStartTime,                  o = a.ref || document.referrer                }                e = (new Date).getTime();                TDBASE.lealSet(e),                TDBASE.addGenre({                  name: t,                  start: n,                  duration: Math.ceil((e - n) / 1e3),                  refer: o                }, "pages")            }      }).init(),    f = {      init: function () {            try {                var e = l.localStorage.get("profile");                e && (e = JSON.parse(e), e = f._transform(e), u.appContext = u.appContext || {}, u.appContext.account = e)            } catch (e) {                console.error(e)            }      },      _transform: function (e) {            e = JSON.parse(JSON.stringify(e));            return e.accountId = e.profileId,            e.type = e.profileType,            delete e.profileType,            delete e.profileId,            e      },      _transformInverse: function (e) {            e = JSON.parse(JSON.stringify(e));            return e.profileId = e.accountId,            e.profileType = e.type,            delete e.type,            delete e.accountId,            e      },      login: function (e) {            f._event(e, "login")      },      register: function (e) {            f._event(e, "register")      },      updateProfile: function (e) {            f._event(e, "update")      },      _chekProfile: function () {            return "object" === _(u.appContext) && "object" === _(u.appContext.account) ? u.appContext.account : null      },      _event: function (e, t) {            if (!e || "object" !== (void 0 === e ? "undefined" : _(e)))                return console.log("profile信息必填!");            if ("update" !== t && !e.profileId && !/0{1}/.test(e.profileId))                return console.log("profileId 信息为必填!");            if ("update" !== t && "number" != typeof e.profileType)                return console.log("profileType 为必填!");            var n,            o = f._getProfile(e, t),            r = {                profileId: "_setId",                profileType: "_setProfileType",                name: "_setName",                gender: "_setGender",                age: "_setAge"            },            i = new RegExp("^property$");            for (n in e) {                var a,                s = e,                c = r;                if (!c || "update" === t && "profileId" === n) {                  if (i.test(n) || "property10" === n)                        if (a = f._setProperty(o, n, s))                            return void console.log(a)                } else if (a = f(o, s))                  return void console.log(a)            }            u.appContext = u.appContext || {},            u.appContext.account = o;            var d = f._transformInverse(o);            l.localStorage.add("profile", JSON.stringify(d)),            o = f._transform(o),            d = f._transform(e),            y.setProfile(d, t)      },      _getProfile: function (e, t) {            var n = {};            return u.appContext && u.appContext.account && (n = JSON.parse(JSON.stringify(u.appContext.account))),            "update" == t || e.profileId === n.accountId ? n : {}      },      _setId: function (e, t) {            if (!t && !/0{1}/.test(t))                return "profileId为必填字段!";            e.accountId = t      },      _setProfileType: function (e, t) {            if ("number" != typeof t || t != t || t < -1 || 6 < t && t < 11 || 20 < t)                return "请上传正确的profileType";            e.type = t      },      _setName: function (e, t) {            if ("string" != typeof t)                return "profile name 类型错误";            e.name = t      },      _setAge: function (e, t) {            if ("number" != typeof t || t != t)                return "profile age 类型错误";            e.age = t      },      _setGender: function (e, t) {            if (0 !== t && 1 !== t & 2 !== t)                return "profile gender 类型错误";            e.gender = t      },      _setProperty: function (e, t, n) {            if ("number" == typeof n && n != n || "string" != typeof n && "number" != typeof n)                return "profile property 类型错误";            e = n      }    },    window.TDAPP = window.TDAPP || {},    window.TDAPP.login = f.login,    window.TDAPP.register = f.register,    window.TDAPP.updateProfile = f.updateProfile,    window.TDAPP.ProfileType = {      0: "ANONYMOUS",      1: "REGISTERED",      2: "SINA_WEIBO",      3: "QQ",      4: "QQ_WEIBO",      5: "ND91",      6: "WEIXIN",      11: "TYPE1",      12: "TYPE2",      13: "TYPE3",      14: "TYPE4",      15: "TYPE5",      16: "TYPE6",      17: "TYPE7",      18: "TYPE8",      19: "TYPE9",      20: "TYPE10"    },    f.init(),    n = {      isObject: function (e) {            return e && "object" === (void 0 === e ? "undefined" : _(e))      },      isStrNotEmpty: function (e) {            return e || /0{1}/.test(e)      },      isNumber: function (e) {            return "number" == typeof e && e == e      },      isCurrencyTypeAvailabal: function (e) {            return e && "string" == typeof e && 3 === e.length      },      _checkParam: function (e) {            return n.isObject(e) ? n.isStrNotEmpty(e.orderId) ? n.isNumber(e.amount) ? !!n.isCurrencyTypeAvailabal(e.currencyType) || (console.warn("请输入正确的currencyType!"), !1) : (console.warn("请输入正确的amount!"), !1) : (console.warn("请输入正确的orderId!"), !1) : (console.warn("请输入正确的参数!"), !1)      },      onPlaceOrder: function (e) {            n._checkParam(e) && (e = {                  count: 1,                  start: (new Date).getTime(),                  domain: "iap",                  id: "placeOrder",                  params: e                }, y._saveAndFetch(e))      },      onOrderPaySucc: function (e) {            n._checkParam(e) && ((e = JSON.parse(JSON.stringify(e))).paymentType && n.isStrNotEmpty(e.paymentType) && (e.payType = e.paymentType), delete e.paymentType, e = {                  count: 1,                  start: (new Date).getTime(),                  domain: "iap",                  id: "pay",                  params: e                }, y._saveAndFetch(e))      },      onCancelOrder: function (e) {            n._checkParam(e) && (e = {                  count: 1,                  start: (new Date).getTime(),                  domain: "iap",                  id: "cancelOrder",                  params: e                }, y._saveAndFetch(e))      }    },    window.TDAPP = window.TDAPP || {},    window.TDAPP.onPlaceOrder = n.onPlaceOrder,    window.TDAPP.onOrderPaySucc = n.onOrderPaySucc,    window.TDAPP.onCancelOrder = n.onCancelOrder;    var S = l.localStorage,    s = l.sessionStorage,    T = {      timedif: void 0,      state: 1,      deviceId: 0,      sessionId: 0,      local: [],      sendInit: 0,      set: function () {            try {                this.setDeviceId(),                this.setSession(),                this.setSessionTime(),                this.setInitTime(),                this.setPartner(),                this.setResolution(),                this.addlastSession(),                this.setPageEnter(),                this.getAjax(1)            } catch (e) {                console.log(e)            }      },      setDeviceId: function () {            if (S.get("deviceId"))                this.deviceId = S.get("deviceId");            else {                this.sendInit = 1;                for (var e = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""), t = [], n = e.length, o = 0; o < 16; o++)                  t = e;                this.deviceId = t.join(""),                S.add("deviceId", this.deviceId)            }            u.deviceId = this.deviceId      },      setSession: function () {            var e,            t;            if (s.get("sessionId") && S.get("appkey") == u.appkey ? t = s.get("sessionId") : (e = (new Date).getTime(), t = -1 < this.deviceId.indexOf("-") ? this.deviceId.split("-") + e : this.deviceId + e, this.sendInit = 0 == this.sendInit ? 2 : this.sendInit, s.add("sessionId", t)), 0 < 32 - t.length)                for (var n = 0, o = 32 - t.length; n < o; n++)                  t += "0";            32 - t.length < 0 && (t = t.substring(0, 32)),            r.data.id = this.sessionId = t      },      setSessionTime: function () {            var e = (new Date).getTime();            s.get("SessionStart") && S.get("appkey") == u.appkey ? e = s.get("SessionStart") : s.add("SessionStart", e),            r.data.start = parseInt(e)      },      setInitTime: function () {            S.get("initTime") ? u.appProfile.initTime = parseInt(S.get("initTime")) : (u.appProfile.initTime = p, S.add("initTime", p))      },      setPartner: function () {            var e = s.get("td_channel"),            t = TDBASE.getArgs().td_channelid;            e ? u.appProfile.partner = e : null != t && (s.add("td_channel", t), u.appProfile.partner = t)      },      setResolution: function () {            var e = ;            window.devicePixelRatio && e.push(window.devicePixelRatio),            u.deviceProfile.pixel = e.join("*")      },      addlastSession: function () {            var e = S.get("lastSession");            void 0 === e && (S.delLocalStorage("sessionMsg"), S.delLocalStorage("lastSession")),            e ? (e = JSON.parse(e)).id != r.data.id && (e = TDBASE.getCommonMsg(e.id, e.start, 3, parseInt(S.get("leaveSession"))), TDBASE.addMsg(e), this.timedif = parseInt((r.data.start - S.get("leavetime")) / 1e3), S.get("appkey") && S.get("appkey") != u.appkey || (TDBASE.addSessionStart(this.timedif, 1), this.addAppInitEvent())) : (TDBASE.addSessionStart(0, 1), this.addAppInitEvent())      },      setPageEnter: function () {            var e;            l.autoTrack && (e = {                  name: window.location.href,                  start: (new Date).getTime(),                  duration: 0,                  refer: document.referrer                }, TDBASE.addGenre(e, "pages"))      },      addAppInitEvent: function () {            var e;            0 != this.sendInit && (e = {                  id: "init",                  domain: "app",                  start: p || (new Date).getTime(),                  count: 1,                  params: {                        first: !0                  }                }, 2 == this.sendInit && (e.params.first = !1), TDBASE.addGenre(e, "events"))      },      getAjax: function (e) {            var t = this,            n = new v;            localStorage.__TD_sessionMsg || TDBASE.addSessionStart(0, 2);            var o,            r = JSON.parse(S.get("sessionMsg")),            i = TDBASE.getCommon(r),            a = localStorage["__TD_td-init-event"];            !a || (o = i.msgs) && (r = o.data.events, o.data.events = r.concat(JSON.parse(a))),            S.delLocalStorage("td-init-event");            for (var s = [], c = 0; c < i.msgs.length; c++) {                var d = i.msgs;                (2 !== d.data.status || d.data.pages && 0 !== d.data.pages.length || d.data.events && 0 !== d.data.events.length) && s.push(d)            }            0 !== s.length && (i.msgs = s, S.get("appkey") ? S.get("appkey") != u.appkey ? n.set(i, function (e) {                  S.delLocalStorage("sessionMsg"),                  u.appProfile.initTime = p,                  S.add("initTime", p),                  TDBASE.addSessionStart(0, 1),                  t.addAppInitEvent(),                  t.getAjax()                }, function (e) {                  console.log(e)                }) : n.set(i, function (e) {                  S.delLocalStorage("sessionMsg"),                  TDBASE.addSessionStart(0, 2)                }, function (e) {                  console.log(e)                }) : n.set(i, function (e) {                  S.delLocalStorage("sessionMsg"),                  TDBASE.addSessionStart(0, 2)                }, function (e) {                  console.log(e)                }), S.add("appkey", u.appkey))      }    };    T.set();    var y = {      set: function (e, t, n, o) {            var r;            if (e || /0{1}/.test(e)) {                if (0 < arguments.length)                  try {                        var i = {                            count: 1,                            start: (new Date).getTime()                        };                        if (null != e && (i.id = "string" != typeof e ? JSON.stringify(e) : e), i.label = null != t ? "string" != typeof t ? JSON.stringify(t) : t : "", null != n && ("object" != (void 0 === (r = n) ? "undefined" : _(r)) || "" != Object.prototype.toString.call(r).toLowerCase() || r.length || (i.params = n)), o && "smart" === o)                            i.type = "smart";                        else if (void 0 !== o) {                            if ("number" != typeof o || isNaN(o))                              return void console.error("value只能为number");                            i.value = o                        }                        y._saveAndFetch(i)                  } catch (e) {}            } else                console.warn("eventId为必填字段!")      },      setProfile: function (e, t) {            e = {                count: 1,                start: (new Date).getTime(),                domain: "account",                id: t,                params: e            };            y._saveAndFetch(e)      },      _saveAndFetch: function (e) {            d ? TDBASE.addGenre(e, "events", function (e) {                var t = S.get("td-hold-event"),                n = [];                if (n.push(e), t) {                  t = JSON.parse(t);                  for (var o = 0; o < t.length; o++)                        if (TDBASE.equal(t, e)) {                            t.count += 1,                            t.start = e.start;                            break                        }                  S.add("td-hold-event", JSON.stringify(t))                } else                  S.add("td-hold-event", JSON.stringify(n))            }) : (TDBASE.addGenre(e, "events"), setTimeout(function () {                  T.getAjax()                }, 500))      },      unload: function () {            try {                T.getAjax()            } catch (e) {}      }    };    window.TDAPP = window.TDAPP || {},    window.TDAPP.onEvent = y.set}();
如果把引用改为访问本地的两个js文件,是不是速度会快很多很多?
试验发现,验证了猜想。

其实原版的DQ3 还有很多js文件调用,统统改为本地文件,不管网络问题还是离线问题,而且首页和编辑器很快可以代开。
这里班门弄斧了,DQ 需要优化的地方太多了,DQ的初衷是为了配合腾讯云的产品吧,所以一切都需要联网,我还停留在discuz那种思维中,这里犯了错误。
页: [1]
查看完整版本: DQ(v3.0.220723)网页加载速度优化 New

创宇盾启航版免费网站防御网站加速服务