nvue.service.cjs.js 2.6 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
'use strict';

Object.defineProperty(exports, '__esModule', {
  value: true
}); // eslint-disable-next-line no-restricted-globals

var VueFactory = require('./nvue.factory.cjs');

var instanceOptions = {};

function createInstanceContext(instanceId, runtimeContext) {
  var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  var nvue = runtimeContext.nvue;
  var instance = instanceOptions[instanceId] = {
    instanceId,
    config: nvue.config,
    document: nvue.document,
    data
  };
  var Vue = instance.Vue = createVueModuleInstance(instanceId, nvue, runtimeContext.SharedObject);
  var instanceContext = {
    Vue
  };
  Object.freeze(instanceContext);
  return instanceContext;
}

function destroyInstance(instanceId) {
  var instance = instanceOptions[instanceId];

  if (instance && instance.app && instance.document) {
    try {
      instance.app.$.appContext.app.unmount();
      instance.document.destroy();
    } catch (e) {}

    delete instance.document;
    delete instance.app;
  }

  delete instanceOptions[instanceId];
}

function refreshInstance(instanceId, data) {
  var instance = instanceOptions[instanceId];

  if (!instance || !instance.app) {
    return new Error("refreshInstance: instance ".concat(instanceId, " not found!"));
  }

  instance.document.taskCenter.send('dom', {
    action: 'refreshFinish'
  }, []);
}

function createVueModuleInstance(instanceId, nvue, SharedObject) {
  var exports = {};
  VueFactory(exports, nvue.document, SharedObject);
  var Vue = exports.Vue;
  var {
    createApp
  } = Vue;

  Vue.createApp = (rootComponent, rootProps) => initApp(createApp(rootComponent, rootProps), {
    instanceId,
    nvue
  });

  return Vue;
}

function initApp(app, _ref) {
  var {
    instanceId,
    nvue
  } = _ref;
  var {
    config: {
      compilerOptions,
      globalProperties
    },
    mount
  } = app;

  compilerOptions.isCustomElement = name => {
    return !!nvue.supports("@component/".concat(name));
  };

  var instance = instanceOptions[instanceId];
  globalProperties.$instanceId = instanceId;
  globalProperties.$document = instance.document;
  globalProperties.$requireModule = nvue.requireModule;

  app.mount = rootContainer => {
    var proxy = instance.app = mount(rootContainer);

    if (rootContainer === '#root') {
      try {
        // Send "createFinish" signal to native.
        nvue.document.taskCenter.send('dom', {
          action: 'createFinish'
        }, []);
      } catch (e) {}
    }

    return proxy;
  };

  return app;
}

exports.createInstanceContext = createInstanceContext;
exports.destroyInstance = destroyInstance;
exports.refreshInstance = refreshInstance;