首页 > 解决方案 > 如何在窗口环境中获取我的 JavaScript UMD 包的完整字符串?`.toString()` 不起作用

问题描述

我有一个名为 的包的 UMD 包utils,它只有一个方法,sum如下所示:

<script src="path/to/my/utils-umd.js"></script>
<script>
console.log(utils.sum([1,2,3]));
// => 6
</script>

现在,我想获取我的 UMD 源代码的完整字符串,我不能简单地fetch('path/to/my/utils-umd.js')出于某种原因,所以我需要同步获取我的 UMD 捆绑字符串。

我尝试了几件事,但没有运气,这里有一些:

window.utils.toString();
// => "[object Module]"
Object.prototype.toString.call(window.utils);
// => "[object Module]"
typeof window.utils;
// => "object"
JSON.stringify(window.utils)
// => "{}"

这是我完整的 UMD 捆绑包源代码:

(function(e, t) {
  'object' === typeof exports && 'object' === typeof module
    ? (module.exports = t())
    : 'function' === typeof define && define.amd
    ? define([], t)
    : 'object' === typeof exports
    ? (exports['utils'] = t())
    : (e['utils'] = t());
})('undefined' !== typeof self ? self : this, function() {
  return (function(e) {
    var t = {};
    function n(r) {
      if (t[r]) return t[r].exports;
      var o = (t[r] = { i: r, l: !1, exports: {} });
      return e[r].call(o.exports, o, o.exports, n), (o.l = !0), o.exports;
    }
    return (
      (n.m = e),
      (n.c = t),
      (n.d = function(e, t, r) {
        n.o(e, t) || Object.defineProperty(e, t, { enumerable: !0, get: r });
      }),
      (n.r = function(e) {
        'undefined' !== typeof Symbol &&
          Symbol.toStringTag &&
          Object.defineProperty(e, Symbol.toStringTag, { value: 'Module' }),
          Object.defineProperty(e, '__esModule', { value: !0 });
      }),
      (n.t = function(e, t) {
        if ((1 & t && (e = n(e)), 8 & t)) return e;
        if (4 & t && 'object' === typeof e && e && e.__esModule) return e;
        var r = Object.create(null);
        if (
          (n.r(r),
          Object.defineProperty(r, 'default', { enumerable: !0, value: e }),
          2 & t && 'string' != typeof e)
        )
          for (var o in e)
            n.d(
              r,
              o,
              function(t) {
                return e[t];
              }.bind(null, o)
            );
        return r;
      }),
      (n.n = function(e) {
        var t =
          e && e.__esModule
            ? function() {
                return e['default'];
              }
            : function() {
                return e;
              };
        return n.d(t, 'a', t), t;
      }),
      (n.o = function(e, t) {
        return Object.prototype.hasOwnProperty.call(e, t);
      }),
      (n.p = ''),
      n((n.s = 'fae3'))
    );
  })({
    f6fd: function(e, t) {
      (function(e) {
        var t = 'currentScript',
          n = e.getElementsByTagName('script');
        t in e ||
          Object.defineProperty(e, t, {
            get: function() {
              try {
                throw new Error();
              } catch (r) {
                var e,
                  t = (/.*at [^\(]*\((.*):.+:.+\)$/gi.exec(r.stack) || [!1])[1];
                for (e in n)
                  if (n[e].src == t || 'interactive' == n[e].readyState)
                    return n[e];
                return null;
              }
            }
          });
      })(document);
    },
    fae3: function(e, t, n) {
      'use strict';
      var r;
      (n.r(t), 'undefined' !== typeof window) &&
        (n('f6fd'),
        (r = window.document.currentScript) &&
          (r = r.src.match(/(.+\/)[^/]+\.js(\?.*)?$/)) &&
          (n.p = r[1]));
      function o(e) {
        return e.reduce(function(e, t) {
          return e + t;
        }, 0);
      }
      n.d(t, 'sum', function() {
        return o;
      });
    }
  });
});
//# sourceMappingURL=utils.umd.min.js.map

是否有可能做到这一点?

标签: javascriptjsonstringobjectumd

解决方案


您只能使用toString可以尝试使所有 UMD 包在具有名称的函数中运行的方法获取函数的源代码,然后您将能够使用toString例如以下方法获取源代码:

function foo() {
  console.log('foo')
  return true;
}
document.getElementById('res').innerText = foo.toString();
<div id="res">
  aaaaaaaaaa
</div>


推荐阅读