weex中使用懒加载,代码无法在android中运行,出现错误" Can't find variable: window"

新手上路,请多包涵

weex 中使用懒加载之后,打包之后的代码,无法在android中跑起来,出现错误“E/WeexCore: ReportException : Exception: ReferenceError: Can't find variable: window”

打包之后和源码结构
图片描述
图片描述
index.vue

<template>
    <div>
        <component v-bind:is="currentTabComponent"></component>
        <tab-bar v-on:switchPage="onTabTo"></tab-bar>
    </div>
</template>

<script>
    import common from '../extend/native/common.vue'
    module.exports = {
        props:{
        },
        data: function () {
            return {
                tabName:"home"
            }
        },
        components: {
            'tab-bar': ()=>import('../components/Tabbar.vue'),
            "home": ()=>import('./home.vue'),
            "center": ()=>import ('./center.vue'),
            "cart": ()=>import('./cart.vue'),
            "new-page": ()=>import( './NewPage.vue')
        },
        computed: {
            currentTabComponent: function () {
                return this.tabName;
            }
        },
        created: function() {
        },
        methods: {
            detail:function(){
                this.$router && this.$router.push("/detail");
            },
            onTabTo(result){
                console.log(result);
                this.tabName=result.labelName;
            }
        }
    }
</script>

webpack 打包之后的,还有几个文件

// { "framework": "Vue"} 

/******/ (function(modules) { // webpackBootstrap
/******/     // install a JSONP callback for chunk loading
/******/     var parentJsonpFunction = window["webpackJsonp"];
/******/     window["webpackJsonp"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {
/******/         // add "moreModules" to the modules object,
/******/         // then flag all "chunkIds" as loaded and fire callback
/******/         var moduleId, chunkId, i = 0, resolves = [], result;
/******/         for(;i < chunkIds.length; i++) {
/******/             chunkId = chunkIds[i];
/******/             if(installedChunks[chunkId]) {
/******/                 resolves.push(installedChunks[chunkId][0]);
/******/             }
/******/             installedChunks[chunkId] = 0;
/******/         }
/******/         for(moduleId in moreModules) {
/******/             if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
/******/                 modules[moduleId] = moreModules[moduleId];
/******/             }
/******/         }
/******/         if(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);
/******/         while(resolves.length) {
/******/             resolves.shift()();
/******/         }
/******/
/******/     };
/******/
/******/     // The module cache
/******/     var installedModules = {};
/******/
/******/     // objects to store loaded and loading chunks
/******/     var installedChunks = {
/******/         5: 0
/******/     };
/******/
/******/     // The require function
/******/     function __webpack_require__(moduleId) {
/******/
/******/         // Check if module is in cache
/******/         if(installedModules[moduleId]) {
/******/             return installedModules[moduleId].exports;
/******/         }
/******/         // Create a new module (and put it into the cache)
/******/         var module = installedModules[moduleId] = {
/******/             i: moduleId,
/******/             l: false,
/******/             exports: {}
/******/         };
/******/
/******/         // Execute the module function
/******/         modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/         // Flag the module as loaded
/******/         module.l = true;
/******/
/******/         // Return the exports of the module
/******/         return module.exports;
/******/     }
/******/
/******/     // This file contains only the entry chunk.
/******/     // The chunk loading function for additional chunks
/******/     __webpack_require__.e = function requireEnsure(chunkId) {
/******/         var installedChunkData = installedChunks[chunkId];
/******/         if(installedChunkData === 0) {
/******/             return new Promise(function(resolve) { resolve(); });
/******/         }
/******/
/******/         // a Promise means "currently loading".
/******/         if(installedChunkData) {
/******/             return installedChunkData[2];
/******/         }
/******/
/******/         // setup Promise in chunk cache
/******/         var promise = new Promise(function(resolve, reject) {
/******/             installedChunkData = installedChunks[chunkId] = [resolve, reject];
/******/         });
/******/         installedChunkData[2] = promise;
/******/
/******/         // start chunk loading
/******/         var head = document.getElementsByTagName('head')[0];
/******/         var script = document.createElement('script');
/******/         script.type = 'text/javascript';
/******/         script.charset = 'utf-8';
/******/         script.async = true;
/******/         script.timeout = 120000;
/******/
/******/         if (__webpack_require__.nc) {
/******/             script.setAttribute("nonce", __webpack_require__.nc);
/******/         }
/******/         script.src = __webpack_require__.p + "" + chunkId + ".js";
/******/         var timeout = setTimeout(onScriptComplete, 120000);
/******/         script.onerror = script.onload = onScriptComplete;
/******/         function onScriptComplete() {
/******/             // avoid mem leaks in IE.
/******/             script.onerror = script.onload = null;
/******/             clearTimeout(timeout);
/******/             var chunk = installedChunks[chunkId];
/******/             if(chunk !== 0) {
/******/                 if(chunk) {
/******/                     chunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));
/******/                 }
/******/                 installedChunks[chunkId] = undefined;
/******/             }
/******/         };
/******/         head.appendChild(script);
/******/
/******/         return promise;
/******/     };
/******/
/******/     // expose the modules object (__webpack_modules__)
/******/     __webpack_require__.m = modules;
/******/
/******/     // expose the module cache
/******/     __webpack_require__.c = installedModules;
/******/
/******/     // identity function for calling harmony imports with the correct context
/******/     __webpack_require__.i = function(value) { return value; };
/******/
/******/     // define getter function for harmony exports
/******/     __webpack_require__.d = function(exports, name, getter) {
/******/         if(!__webpack_require__.o(exports, name)) {
/******/             Object.defineProperty(exports, name, {
/******/                 configurable: false,
/******/                 enumerable: true,
/******/                 get: getter
/******/             });
/******/         }
/******/     };
/******/
/******/     // getDefaultExport function for compatibility with non-harmony modules
/******/     __webpack_require__.n = function(module) {
/******/         var getter = module && module.__esModule ?
/******/             function getDefault() { return module['default']; } :
/******/             function getModuleExports() { return module; };
/******/         __webpack_require__.d(getter, 'a', getter);
/******/         return getter;
/******/     };
/******/
/******/     // Object.prototype.hasOwnProperty.call
/******/     __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/     // __webpack_public_path__
/******/     __webpack_require__.p = "";
/******/
/******/     // on error function for async loading
/******/     __webpack_require__.oe = function(err) { console.error(err); throw err; };
/******/
/******/     // Load entry module and return exports
/******/     return __webpack_require__(__webpack_require__.s = 33);
/******/ })
/************************************************************************/
/******/ ({

/***/ 16:
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var _common = __webpack_require__(27);

var _common2 = _interopRequireDefault(_common);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

module.exports = {
    props: {},
    data: function data() {
        return {
            tabName: "home"
        };
    },
    components: {
        'tab-bar': function tabBar() {
            return __webpack_require__.e/* import() */(4).then(__webpack_require__.bind(null, 37));
        },
        "home": function home() {
            return __webpack_require__.e/* import() */(0).then(__webpack_require__.bind(null, 41));
        },
        "center": function center() {
            return __webpack_require__.e/* import() */(1).then(__webpack_require__.bind(null, 40));
        },
        "cart": function cart() {
            return __webpack_require__.e/* import() */(2).then(__webpack_require__.bind(null, 39));
        },
        "new-page": function newPage() {
            return __webpack_require__.e/* import() */(3).then(__webpack_require__.bind(null, 38));
        }
    },
    computed: {
        currentTabComponent: function currentTabComponent() {
            return this.tabName;
        }
    },
    created: function created() {},
    methods: {
        detail: function detail() {
            this.$router && this.$router.push("/detail");
        },
        onTabTo: function onTabTo(result) {
            console.log(result);
            this.tabName = result.labelName;
        }
    }
}; //
//
//
//
//
//
//

/***/ }),

/***/ 21:
/***/ (function(module, exports) {

module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
  return _c('div', [_c(_vm.currentTabComponent, {
    tag: "component"
  }), _c('tab-bar', {
    on: {
      "switchPage": _vm.onTabTo
    }
  })], 1)
},staticRenderFns: []}
module.exports.render._withStripped = true

/***/ }),

/***/ 23:
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/**
 * weex-evnt-vue-router v0.0.4
 * (c) 2018 fushun
 * link https://github.com/dongnaebi/weex-vue-router
 * @license Apache-2.0
 */


var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

var index$1 = Array.isArray || function (arr) {
  return Object.prototype.toString.call(arr) == '[object Array]';
};

var isarray = index$1;

/**
 * Expose `pathToRegexp`.
 */
var index = pathToRegexp;
var parse_1 = parse;
var compile_1 = compile;
var tokensToFunction_1 = tokensToFunction;
var tokensToRegExp_1 = tokensToRegExp;

/**
 * The main path matching regexp utility.
 *
 * @type {RegExp}
 */
var PATH_REGEXP = new RegExp([
// Match escaped characters that would otherwise appear in future matches.
// This allows the user to escape special characters that won't transform.
'(\\\\.)',
// Match Express-style parameters and un-named parameters with a prefix
// and optional suffixes. Matches appear as:
//
// "/:test(\\d+)?" => ["/", "test", "\d+", undefined, "?", undefined]
// "/route(\\d+)"  => [undefined, undefined, undefined, "\d+", undefined, undefined]
// "/*"            => ["/", undefined, undefined, undefined, undefined, "*"]
'([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))'].join('|'), 'g');

/**
 * Parse a string for the raw tokens.
 *
 * @param  {string}  str
 * @param  {Object=} options
 * @return {!Array}
 */
function parse(str, options) {
  var tokens = [];
  var key = 0;
  var index = 0;
  var path = '';
  var defaultDelimiter = options && options.delimiter || '/';
  var res;

  while ((res = PATH_REGEXP.exec(str)) != null) {
    var m = res[0];
    var escaped = res[1];
    var offset = res.index;
    path += str.slice(index, offset);
    index = offset + m.length;

    // Ignore already escaped sequences.
    if (escaped) {
      path += escaped[1];
      continue;
    }

    var next = str[index];
    var prefix = res[2];
    var name = res[3];
    var capture = res[4];
    var group = res[5];
    var modifier = res[6];
    var asterisk = res[7];

    // Push the current path onto the tokens.
    if (path) {
      tokens.push(path);
      path = '';
    }

    var partial = prefix != null && next != null && next !== prefix;
    var repeat = modifier === '+' || modifier === '*';
    var optional = modifier === '?' || modifier === '*';
    var delimiter = res[2] || defaultDelimiter;
    var pattern = capture || group;

    tokens.push({
      name: name || key++,
      prefix: prefix || '',
      delimiter: delimiter,
      optional: optional,
      repeat: repeat,
      partial: partial,
      asterisk: !!asterisk,
      pattern: pattern ? escapeGroup(pattern) : asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?'
    });
  }

  // Match any characters still remaining.
  if (index < str.length) {
    path += str.substr(index);
  }

  // If the path exists, push it onto the end.
  if (path) {
    tokens.push(path);
  }

  return tokens;
}

/**
 * Compile a string to a template function for the path.
 *
 * @param  {string}             str
 * @param  {Object=}            options
 * @return {!function(Object=, Object=)}
 */
function compile(str, options) {
  return tokensToFunction(parse(str, options));
}

/**
 * Prettier encoding of URI path segments.
 *
 * @param  {string}
 * @return {string}
 */
function encodeURIComponentPretty(str) {
  return encodeURI(str).replace(/[\/?#]/g, function (c) {
    return '%' + c.charCodeAt(0).toString(16).toUpperCase();
  });
}

/**
 * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.
 *
 * @param  {string}
 * @return {string}
 */
function encodeAsterisk(str) {
  return encodeURI(str).replace(/[?#]/g, function (c) {
    return '%' + c.charCodeAt(0).toString(16).toUpperCase();
  });
}

/**
 * Expose a method for transforming tokens into the path function.
 */
function tokensToFunction(tokens) {
  // Compile all the tokens into regexps.
  var matches = new Array(tokens.length);

  // Compile all the patterns before compilation.
  for (var i = 0; i < tokens.length; i++) {
    if (_typeof(tokens[i]) === 'object') {
      matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$');
    }
  }

  return function (obj, opts) {
    var path = '';
    var data = obj || {};
    var options = opts || {};
    var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent;

    for (var i = 0; i < tokens.length; i++) {
      var token = tokens[i];

      if (typeof token === 'string') {
        path += token;

        continue;
      }

      var value = data[token.name];
      var segment;

      if (value == null) {
        if (token.optional) {
          // Prepend partial segment prefixes.
          if (token.partial) {
            path += token.prefix;
          }

          continue;
        } else {
          throw new TypeError('Expected "' + token.name + '" to be defined');
        }
      }

      if (isarray(value)) {
        if (!token.repeat) {
          throw new TypeError('Expected "' + token.name + '" to not repeat, but received `' + JSON.stringify(value) + '`');
        }

        if (value.length === 0) {
          if (token.optional) {
            continue;
          } else {
            throw new TypeError('Expected "' + token.name + '" to not be empty');
          }
        }

        for (var j = 0; j < value.length; j++) {
          segment = encode(value[j]);

          if (!matches[i].test(segment)) {
            throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '", but received `' + JSON.stringify(segment) + '`');
          }

          path += (j === 0 ? token.prefix : token.delimiter) + segment;
        }

        continue;
      }

      segment = token.asterisk ? encodeAsterisk(value) : encode(value);

      if (!matches[i].test(segment)) {
        throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but received "' + segment + '"');
      }

      path += token.prefix + segment;
    }

    return path;
  };
}

/**
 * Escape a regular expression string.
 *
 * @param  {string} str
 * @return {string}
 */
function escapeString(str) {
  return str.replace(/([.+*?=^!:${}()[\]|\/\\])/g, '\\$1');
}

/**
 * Escape the capturing group by escaping special characters and meaning.
 *
 * @param  {string} group
 * @return {string}
 */
function escapeGroup(group) {
  return group.replace(/([=!:$\/()])/g, '\\$1');
}

/**
 * Attach the keys as a property of the regexp.
 *
 * @param  {!RegExp} re
 * @param  {Array}   keys
 * @return {!RegExp}
 */
function attachKeys(re, keys) {
  re.keys = keys;
  return re;
}

/**
 * Get the flags for a regexp from the options.
 *
 * @param  {Object} options
 * @return {string}
 */
function flags(options) {
  return options.sensitive ? '' : 'i';
}

/**
 * Pull out keys from a regexp.
 *
 * @param  {!RegExp} path
 * @param  {!Array}  keys
 * @return {!RegExp}
 */
function regexpToRegexp(path, keys) {
  // Use a negative lookahead to match only capturing groups.
  var groups = path.source.match(/\((?!\?)/g);

  if (groups) {
    for (var i = 0; i < groups.length; i++) {
      keys.push({
        name: i,
        prefix: null,
        delimiter: null,
        optional: false,
        repeat: false,
        partial: false,
        asterisk: false,
        pattern: null
      });
    }
  }

  return attachKeys(path, keys);
}

/**
 * Transform an array into a regexp.
 *
 * @param  {!Array}  path
 * @param  {Array}   keys
 * @param  {!Object} options
 * @return {!RegExp}
 */
function arrayToRegexp(path, keys, options) {
  var parts = [];

  for (var i = 0; i < path.length; i++) {
    parts.push(pathToRegexp(path[i], keys, options).source);
  }

  var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options));

  return attachKeys(regexp, keys);
}

/**
 * Create a path regexp from string input.
 *
 * @param  {string}  path
 * @param  {!Array}  keys
 * @param  {!Object} options
 * @return {!RegExp}
 */
function stringToRegexp(path, keys, options) {
  return tokensToRegExp(parse(path, options), keys, options);
}

/**
 * Expose a function for taking tokens and returning a RegExp.
 *
 * @param  {!Array}          tokens
 * @param  {(Array|Object)=} keys
 * @param  {Object=}         options
 * @return {!RegExp}
 */
function tokensToRegExp(tokens, keys, options) {
  if (!isarray(keys)) {
    options = /** @type {!Object} */keys || options;
    keys = [];
  }

  options = options || {};

  var strict = options.strict;
  var end = options.end !== false;
  var route = '';

  // Iterate over the tokens and create our regexp string.
  for (var i = 0; i < tokens.length; i++) {
    var token = tokens[i];

    if (typeof token === 'string') {
      route += escapeString(token);
    } else {
      var prefix = escapeString(token.prefix);
      var capture = '(?:' + token.pattern + ')';

      keys.push(token);

      if (token.repeat) {
        capture += '(?:' + prefix + capture + ')*';
      }

      if (token.optional) {
        if (!token.partial) {
          capture = '(?:' + prefix + '(' + capture + '))?';
        } else {
          capture = prefix + '(' + capture + ')?';
        }
      } else {
        capture = prefix + '(' + capture + ')';
      }

      route += capture;
    }
  }

  var delimiter = escapeString(options.delimiter || '/');
  var endsWithDelimiter = route.slice(-delimiter.length) === delimiter;

  // In non-strict mode we allow a slash at the end of match. If the path to
  // match already ends with a slash, we remove it for consistency. The slash
  // is valid at the end of a path match, not in the middle. This is important
  // in non-ending mode, where "/test/" shouldn't match "/test//route".
  if (!strict) {
    route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?';
  }

  if (end) {
    route += '$';
  } else {
    // In non-ending mode, we need the capturing groups to match as much as
    // possible by using a positive lookahead to the end or next path segment.
    route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)';
  }

  return attachKeys(new RegExp('^' + route, flags(options)), keys);
}

/**
 * Normalize the given path string, returning a regular expression.
 *
 * An empty array can be passed in for the keys, which will hold the
 * placeholder key descriptions. For example, using `/user/:id`, `keys` will
 * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.
 *
 * @param  {(string|RegExp|Array)} path
 * @param  {(Array|Object)=}       keys
 * @param  {Object=}               options
 * @return {!RegExp}
 */
function pathToRegexp(path, keys, options) {
  if (!isarray(keys)) {
    options = /** @type {!Object} */keys || options;
    keys = [];
  }

  options = options || {};

  if (path instanceof RegExp) {
    return regexpToRegexp(path, /** @type {!Array} */keys);
  }

  if (isarray(path)) {
    return arrayToRegexp( /** @type {!Array} */path, /** @type {!Array} */keys, options);
  }

  return stringToRegexp( /** @type {string} */path, /** @type {!Array} */keys, options);
}

index.parse = parse_1;
index.compile = compile_1;
index.tokensToFunction = tokensToFunction_1;
index.tokensToRegExp = tokensToRegExp_1;

/**
 * Created by ebi on 2017/2/14.
 */
var weexVueRouter = {
  install: function install(Vue, ref) {
    var routes = ref.routes;
    var weex = ref.weex;

    var platform = weex.config.env ? weex.config.env.platform : weex.config.platform;
    if (platform.toLowerCase() == 'web') {
      return;
    }
    var event = weex.requireModule('event');
    var bundleUrl = weex.config.bundleUrl;
    var route = bundleToPath(bundleUrl, routes);
    Object.defineProperty(Vue.prototype, "$router", {
      value: {
        push: function push(url) {
          var bundle = pathToBundle(url, routes);
          if (event) {
            if (!("file://".startsWith(bundle) || "http://".startsWith(bundle) || "https".startsWith(bundle))) {
              //默认采用文件的方式
              bundle = "file://" + bundle;
            }
            console.log(bundle);
            event.push({
              'url': bundle,
              'animated': 'true'
            }, function () {
              console.log('skip complete');
            });
          }
        },
        back: function back() {
          if (event) {
            event.pop();
          }
        }
      },
      configurable: false
    });
    Object.defineProperty(Vue.prototype, '$route', {
      configurable: false,
      value: {
        path: route.path,
        params: route.params,
        query: route.query,
        hash: route.hash,
        fullPath: route.fullPath,
        matched: route.matched,
        name: route.name
      }
    });
  }
};
function pathToBundle(url, routes) {
  /* url='/list/2-1?from=1#2'
   * r={path:'/list/:cid-:id',bundle:'/product/list.js'}
   * */
  if (url.indexOf('/') != 0) {
    console.error("the url must begin with '/'");
    return '';
  }

  //copy from vue-router
  var encodeReserveRE = /[!'()*]/g;
  var encodeReserveReplacer = function encodeReserveReplacer(c) {
    return '%' + c.charCodeAt(0).toString(16);
  };
  var encode = function encode(str) {
    return encodeURIComponent(str).replace(encodeReserveRE, encodeReserveReplacer).replace(/%2C/g, ',');
  };

  /*find out the rule*/
  var matchRule = {};
  routes.forEach(function (r) {
    var re = index(r.path);
    var match = re.exec(url);
    if (match != null) {
      matchRule = r;
    }
  });

  /*get the key and value*/
  var keys = [];
  var pathReg = index(matchRule.path, keys);
  var values = pathReg.exec(url);
  var lastValue = values[values.length - 1]; //save the last value to find query and hash
  values[values.length - 1] = lastValue.split(/\?|\#/)[0]; //the true value

  /*parse params to key/value object*/
  var params = {};
  if (keys.length > 0) {
    keys.forEach(function (key, i) {
      params[key.name] = values[i + 1];
    });
  }

  /*get query and hash*/
  var queryIndex = lastValue.indexOf('?');
  var hashIndex = lastValue.indexOf('#');
  if (queryIndex > 0 && hashIndex > 0 && queryIndex > hashIndex) {
    console.error("Could not set '#' behind '?'");
    return '';
  }
  var queryStr = queryIndex > 0 ? lastValue.substring(queryIndex + 1, hashIndex > 0 ? hashIndex : lastValue.length) : "";
  var hashStr = hashIndex > 0 ? lastValue.substring(hashIndex, lastValue.length) : "";
  var query = getParams(queryStr); //{from:1}

  /*add the bundleUrl's params and hash*/
  var componentPath = matchRule.component;
  for (var k in params) {
    componentPath += (componentPath.indexOf('?') > 0 ? '&' : '?') + k + '=' + encode(params[k]);
  }
  for (var q in query) {
    componentPath += (componentPath.indexOf('?') > 0 ? '&' : '?') + q + '=' + encode(query[q]);
  }
  componentPath += hashStr;
  return componentPath;
}
function bundleToPath(url, routes) {
  //url='domain/product/list.js?cid=2&id=1&from=1'
  //matchRule={path:'/list/:cid-:id',component:'domain/product/list.js'}
  var route = {
    params: null,
    query: null,
    hash: null,
    path: null,
    fullPath: null,
    matched: null,
    name: null
  };
  var jsBundle = url.split(/\?|\#/)[0];
  /*find out the rule*/
  var matchRule = null;
  routes.forEach(function (r) {
    r.component == jsBundle && (matchRule = r);
    //http://192.168.253.124:8080/dist/product/list.js
  });
  if (!matchRule) {
    console.error("your component must be like '" + jsBundle + "',can not find it in routes,please check up");
    return route;
  }

  /*use pathToRegexp*/
  var keys = [];
  index(matchRule.path, keys);

  /*get query and hash*/
  var queryIndex = url.indexOf('?');
  var hashIndex = url.indexOf('#');
  var queryStr = queryIndex > 0 ? url.substring(queryIndex + 1, hashIndex > 0 ? hashIndex : url.length) : "";
  route.hash = hashIndex > 0 ? url.substring(hashIndex, url.length) : "";

  var allQuery = getParams(queryStr); //{cid:2,id:1,from:1}

  var params = {},
      //{cid:2,id:1}
  query = {},
      //{from:1}
  paramsKey = []; //['cid','id']
  if (keys.length > 0) {
    paramsKey = keys.map(function (key) {
      return key.name;
    });
  }
  for (var q in allQuery) {
    allQuery[q] = decodeURIComponent(allQuery[q]);
    paramsKey.indexOf(q) < 0 ? query[q] = allQuery[q] : params[q] = allQuery[q];
  }
  route.params = params;
  route.query = query;

  //path and fullPath
  var path = matchRule.path;
  for (var p in params) {
    path = path.replace(':' + p, params[p]);
  }
  route.path = path;
  var queryArr = [];
  for (var i in query) {
    queryArr.push(i + '=' + query[i]);
  }
  route.fullPath = path + '?' + queryArr.join('&') + route.hash;
  route.matched = matchRule;
  route.name = matchRule.name;

  return route;
}
function getParams(str) {
  var temp = {};
  if (!str) {
    return temp;
  }
  if (str.indexOf('=') < 0) {
    temp[str] = "";
    return temp;
  }
  var arr = str.split('&');
  arr.forEach(function (item) {
    var w = item.match(/([^=]*)=(.*)/);
    temp[w[1]] = w[2];
  });
  return temp;
}

module.exports = weexVueRouter;

/***/ }),

/***/ 24:
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
    value: true
});
/**
 * Created by zwwill on 2017/8/27.
 */

var utilFunc = {
    initIconFont: function initIconFont() {
        var domModule = weex.requireModule('dom');
        domModule.addRule('fontFace', {
            'fontFamily': "iconfont",
            'src': "url('http://at.alicdn.com/t/font_404010_f29c7wlkludz33di.ttf')"
        });
    },
    setBundleUrl: function setBundleUrl(url, jsFile) {
        var bundleUrl = url;
        var host = '';
        var path = '';
        var nativeBase = void 0;
        var isAndroidAssets = bundleUrl.indexOf('your_current_IP') >= 0 || bundleUrl.indexOf('file://assets/') >= 0;
        var isiOSAssets = bundleUrl.indexOf('file:///') >= 0 && bundleUrl.indexOf('WeexDemo.app') > 0;
        if (isAndroidAssets) {
            nativeBase = 'file://assets/dist';
        } else if (isiOSAssets) {
            nativeBase = bundleUrl.substring(0, bundleUrl.lastIndexOf('/') + 1);
        } else {
            var matches = /\/\/([^\/]+?)\//.exec(bundleUrl);
            var matchFirstPath = /\/\/[^\/]+\/([^\/\s]+)\//.exec(bundleUrl);
            if (matches && matches.length >= 2) {
                host = matches[1];
            }
            if (matchFirstPath && matchFirstPath.length >= 2) {
                path = matchFirstPath[1];
            }
            nativeBase = 'http://' + host + '/';
        }
        var h5Base = './index.html?page=';
        // in Native
        var base = nativeBase;
        if (typeof navigator !== 'undefined' && (navigator.appCodeName === 'Mozilla' || navigator.product === 'Gecko')) {
            // check if in weexpack project
            if (path === 'web' || path === 'dist') {
                base = h5Base + '/dist/';
            } else {
                base = h5Base + '';
            }
        } else {
            base = nativeBase + (!!path ? path + '/' : '');
        }

        var newUrl = base + jsFile;
        return newUrl;
    },
    getUrlSearch: function getUrlSearch(url, name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
        var r = url.slice(url.indexOf('?') + 1).match(reg);
        if (r != null) {
            try {
                return decodeURIComponent(r[2]);
            } catch (_e) {
                return null;
            }
        }
        return null;
    }
};

exports.default = utilFunc;

/***/ }),

/***/ 25:
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var _weexEvntVueRouter = __webpack_require__(23);

var _weexEvntVueRouter2 = _interopRequireDefault(_weexEvntVueRouter);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

//web端的路由在web-router里定义,在app.js里引用
var basePath = ""; /**
                    * Created by ebi on 2017/1/23.
                    */

var routes = [{ path: '/', component: basePath + 'assets/index.js' }, { path: 'home', component: basePath + 'assets/index.js' }, { path: '/detail', component: basePath + 'assets/views/detail.js' }, { path: '/pay', component: basePath + 'assets/views/pay.js' }];

Vue.use(_weexEvntVueRouter2.default, { routes: routes, weex: weex });

/***/ }),

/***/ 27:
/***/ (function(module, exports, __webpack_require__) {

var __vue_exports__, __vue_options__
var __vue_styles__ = []

/* script */
__vue_exports__ = __webpack_require__(35)

/* template */
var __vue_template__ = __webpack_require__(36)
__vue_options__ = __vue_exports__ = __vue_exports__ || {}
if (
  typeof __vue_exports__.default === "object" ||
  typeof __vue_exports__.default === "function"
) {
if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
__vue_options__ = __vue_exports__ = __vue_exports__.default
}
if (typeof __vue_options__ === "function") {
  __vue_options__ = __vue_options__.options
}
__vue_options__.__file = "D:\\project\\weex\\chat-js\\src\\extend\\native\\common.vue"
__vue_options__.render = __vue_template__.render
__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
__vue_options__.style = __vue_options__.style || {}
__vue_styles__.forEach(function (module) {
  for (var name in module) {
    __vue_options__.style[name] = module[name]
  }
})
if (typeof __register_static_styles__ === "function") {
  __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
}

module.exports = __vue_exports__


/***/ }),

/***/ 33:
/***/ (function(module, exports, __webpack_require__) {

var __vue_exports__, __vue_options__
var __vue_styles__ = []

/* script */
__vue_exports__ = __webpack_require__(16)

/* template */
var __vue_template__ = __webpack_require__(21)
__vue_options__ = __vue_exports__ = __vue_exports__ || {}
if (
  typeof __vue_exports__.default === "object" ||
  typeof __vue_exports__.default === "function"
) {
if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
__vue_options__ = __vue_exports__ = __vue_exports__.default
}
if (typeof __vue_options__ === "function") {
  __vue_options__ = __vue_options__.options
}
__vue_options__.__file = "D:\\project\\weex\\chat-js\\src\\views\\index.vue"
__vue_options__.render = __vue_template__.render
__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
__vue_options__.style = __vue_options__.style || {}
__vue_styles__.forEach(function (module) {
  for (var name in module) {
    __vue_options__.style[name] = module[name]
  }
})
if (typeof __register_static_styles__ === "function") {
  __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
}

module.exports = __vue_exports__
module.exports.el = 'true'
new Vue(module.exports)


/***/ }),

/***/ 35:
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
    value: true
});

var _util = __webpack_require__(24);

var _util2 = _interopRequireDefault(_util);

var _nativeRouter = __webpack_require__(25);

var _nativeRouter2 = _interopRequireDefault(_nativeRouter);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

//
//

exports.default = {
    created: function created() {
        _util2.default.initIconFont();
    }
};

/***/ }),

/***/ 36:
/***/ (function(module, exports) {

module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
  return _c("div")
},staticRenderFns: []}
module.exports.render._withStripped = true

/***/ })

/******/ });

andorid 错误异常



I/ContentCatcher: Interceptor : Catcher list invalid for com.alibaba.weex@com.alibaba.weex.IndexActivity@234540188
    Interceptor : Get featureInfo from config pick_mode
W/weex: Warning :Component tree has not build completely,onActivityCreate can not be call!
D/CLog: Warning :Component tree has not build completely,onActivityCreate can not be call!
E/weex: end getBundleType type:Others time:1
D/CLog: end getBundleType type:Others time:1
D/Update: check for update: 20
D/CLog: Update:check for update: 20
W/weex: Warning :Component tree has not build completely,onActivityStart can not be call!
D/CLog: Warning :Component tree has not build completely,onActivityStart can not be call!
W/weex: Warning :Component tree has not build completely, onActivityResume can not be call!
D/CLog: Warning :Component tree has not build completely, onActivityResume can not be call!
D/NetworkSecurityConfig: No Network Security Config specified, using platform default
E/WeexCore:  ReportException : Exception: ReferenceError: Can't find variable: window
    (global function):8:43
    (global function):154:12
    anonymous@(global function):1456:7
    (weex framework):1:41792
    createInstance@(weex framework):1:41803
    (weex framework):1:178788
E/weex: reportJSException >>>> instanceId:1, exception function:createInstance, exception:Exception: ReferenceError: Can't find variable: window
    (global function):8:43
    (global function):154:12
    anonymous@(global function):1456:7
    (weex framework):1:41792
    createInstance@(weex framework):1:41803
    (weex framework):1:178788
D/CLog: reportJSException >>>> instanceId:1, exception function:createInstance, exception:Exception: ReferenceError: Can't find variable: window
    (global function):8:43
    (global function):154:12
    anonymous@(global function):1456:7
    (weex framework):1:41792
    createInstance@(weex framework):1:41803
    (weex framework):1:178788
D/weex:  errCode:-9600,function:createInstance,exception:Exception: ReferenceError: Can't find variable: window
    (global function):8:43
    (global function):154:12
    anonymous@(global function):1456:7
    (weex framework):1:41792
    createInstance@(weex framework):1:41803
    (weex framework):1:178788
    
     getTemplateInfo== template md5 e734fd1ae5deb3484e9abafcbd581df0 length 40547 base64 md5 5zT9GuXes0hOmrr8vVgd8A== response header {"templateSourceBase64MD5":["5zT9GuXes0hOmrr8vVgd8A=="],"templateSourceMD5":["e734fd1ae5deb3484e9abafcbd581df0"]}
D/CLog: weex: errCode:-9600,function:createInstance,exception:Exception: ReferenceError: Can't find variable: window
    (global function):8:43
    (global function):154:12
    anonymous@(global function):1456:7
    (weex framework):1:41792
    createInstance@(weex framework):1:41803
    (weex framework):1:178788
    
     getTemplateInfo== template md5 e734fd1ae5deb3484e9abafcbd581df0 length 40547 base64 md5 5zT9GuXes0hOmrr8vVgd8A== response header {"templateSourceBase64MD5":["5zT9GuXes0hOmrr8vVgd8A=="],"templateSourceMD5":["e734fd1ae5deb3484e9abafcbd581df0"]}
阅读 10k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏