收藏
回答

Uncaught TypeError: Cannot redefine property

问题模块 框架类型 问题类型 操作系统 工具版本
开发者工具 小游戏 Bug macOS 1.02.1907300

构建npm时报错:Uncaught TypeError: Cannot redefine property: settings

在引入pixi.js库的时候,出现这个错误。尝试了以前的代码,用旧版本的开发工具构建的npm没有问题,用当前版本构建的npm就会出现这个错误。


最后一次编辑于  09-25
回答关注问题邀请回答
收藏

4 个回答

  • cover
    cover
    09-25

    你好,反馈已收到,我们核实下,有进展会同步。

    09-25
    赞同
    回复
  • 小游戏运营专员-宏
    小游戏运营专员-宏
    09-25

    您好,请提供一下能复现问题的简单代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)。

    09-25
    赞同
    回复 2
    • dxd
      dxd
      09-25

      https://developers.weixin.qq.com/s/t69HEEm978bB

      需要npm install,然后npm构建一下。真正出错的代码就是

      import * as PIXI from 'pixi.js';

      我发布过一款使用pixijs开发的游戏,我把大约5个月前的代码拿出来测试了一下。在没有重新npm构建以前,代码运行正常。如果重新构建,那么就会出这类错误。

      09-25
      回复
    • dxd
      dxd
      09-25回复dxd

      构建npm的__REQUIRE逻辑发生了变化:

      // 旧版本:可运行版本
       
      var __REQUIRE__ = function (modId, source) {
        if (!__MODS__[modId]) return require(source);
        if (!__MODS__[modId].status) {
          var m = { exports: {} };
          __MODS__[modId].status = 1;
          __MODS__[modId].func(__MODS__[modId].req, m, m.exports);
          if (typeof m.exports === "object") {
            Object.keys(m.exports).forEach(function (k) {
              __MODS__[modId].m.exports[k] = m.exports[k];
            });
            if (m.exports.__esModule) Object.defineProperty(__MODS__[modId].m.exports, "__esModule", { value: true });
          } else {
            __MODS__[modId].m.exports = m.exports;
          }
        }
        return __MODS__[modId].m.exports;
      };
       
      // 当前版本:出错版本
       
      var __REQUIRE__ = function (modId, source) {
        if (!__MODS__[modId]) return require(source);
        if (!__MODS__[modId].status) {
          var m = { exports: {} };
          __MODS__[modId].status = 1;
          __MODS__[modId].func(__MODS__[modId].req, m, m.exports);
          if (typeof m.exports === "object") {
            __MODS__[modId].m.exports.__proto__ = m.exports.__proto__;
            Object.keys(m.exports).forEach(function (k) {
              __MODS__[modId].m.exports[k] = m.exports[k];
              Object.defineProperty(m.exports, k, { set: function (val) { __MODS__[modId].m.exports[k] = val; }, get: function () { return __MODS__[modId].m.exports[k]; } });
            });
            if (m.exports.__esModule) Object.defineProperty(__MODS__[modId].m.exports, "__esModule", { value: true });
          } else {
            __MODS__[modId].m.exports = m.exports;
          }
        }
        return __MODS__[modId].m.exports;
      };

      麻烦看一下谢谢!

      09-25
      回复
  • 王彬宇
    王彬宇
    10-12

    楼主有进展吗?我也遇到了这个问题

    10-12
    赞同
    回复
  • dxd
    dxd
    09-25

    google了一下这个问题似乎主要是由于Object.defineProperty函数引起的,我把两次npm构建的库的头部扒下来了:

    首先是,可运行版本的:

    module.exports = (function() {
    var __MODS__ = {};
    var __DEFINE__ = function(modId, func, req) { var m = { exports: {} }; __MODS__[modId] = { status: 0, func: func, req: req, m: m }; };
    var __REQUIRE__ = function(modId, source) { if(!__MODS__[modId]) return require(source); if(!__MODS__[modId].status) { var m = { exports: {} }; __MODS__[modId].status = 1; __MODS__[modId].func(__MODS__[modId].req, m, m.exports); if(typeof m.exports === "object") { Object.keys(m.exports).forEach(function(k) { __MODS__[modId].m.exports[k] = m.exports[k]; }); if(m.exports.__esModule) Object.defineProperty(__MODS__[modId].m.exports, "__esModule", { value: true }); } else { __MODS__[modId].m.exports = m.exports; } } return __MODS__[modId].m.exports; };
    var __REQUIRE_WILDCARD__ = function(obj) { if(obj && obj.__esModule) { return obj; } else { var newObj = {}; if(obj != null) { for(var k in obj) { if (Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; } } newObj.default = obj; return newObj; } };
    var __REQUIRE_DEFAULT__ = function(obj) { return obj && obj.__esModule ? obj.default : obj; };
    __DEFINE__(1555474367735, function(require, module, exports) {


    下面是现在版本(出错版本的):

    module.exports = (function() {
    var __MODS__ = {};
    var __DEFINE__ = function(modId, func, req) { var m = { exports: {} }; __MODS__[modId] = { status: 0, func: func, req: req, m: m }; };
    var __REQUIRE__ = function(modId, source) { if(!__MODS__[modId]) return require(source); if(!__MODS__[modId].status) { var m = { exports: {} }; __MODS__[modId].status = 1; __MODS__[modId].func(__MODS__[modId].req, m, m.exports); if(typeof m.exports === "object") { __MODS__[modId].m.exports.__proto__ = m.exports.__proto__; Object.keys(m.exports).forEach(function(k) { __MODS__[modId].m.exports[k] = m.exports[k]; Object.defineProperty(m.exports, k, { set: function(val) { __MODS__[modId].m.exports[k] = val; }, get: function() { return __MODS__[modId].m.exports[k]; } }); }); if(m.exports.__esModule) Object.defineProperty(__MODS__[modId].m.exports, "__esModule", { value: true }); } else { __MODS__[modId].m.exports = m.exports; } } return __MODS__[modId].m.exports; };
    var __REQUIRE_WILDCARD__ = function(obj) { if(obj && obj.__esModule) { return obj; } else { var newObj = {}; if(obj != null) { for(var k in obj) { if (Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; } } newObj.default = obj; return newObj; } };
    var __REQUIRE_DEFAULT__ = function(obj) { return obj && obj.__esModule ? obj.default : obj; };
    __DEFINE__(1569398223144, function(require, module, exports) {


    09-25
    赞同
    回复 2
    • dxd
      dxd
      09-25

      我又测试了一下,如果用可用版本的头部替换掉现在版本的,就不会报错了。新版本的构建npm是不是哪里的逻辑和配置做了修改,我们开发者需要那些注意的?总不能老是手工替换吧。

      09-25
      回复
    • dxd
      dxd
      09-25

      两种情况下的__REQUIRE__逻辑比较:

      // 可运行版本:旧版本
       
      var __REQUIRE__ = function(modId, source) {
          if (!__MODS__[modId]) return require(source);
          if (!__MODS__[modId].status) {
              var m = { exports: {} };
              __MODS__[modId].status = 1;
              __MODS__[modId].func(__MODS__[modId].req, m, m.exports);
              if (typeof m.exports === "object") { Object.keys(m.exports).forEach(function(k) { __MODS__[modId].m.exports[k] = m.exports[k]; }); if (m.exports.__esModule) Object.defineProperty(__MODS__[modId].m.exports, "__esModule", { value: true }); } else { __MODS__[modId].m.exports = m.exports; }
          }
          return __MODS__[modId].m.exports;
      };
       
      // 出错版本:当前版本
       
      var __REQUIRE__ = function(modId, source) {
          if (!__MODS__[modId]) return require(source);
          if (!__MODS__[modId].status) {
              var m = { exports: {} };
              __MODS__[modId].status = 1;
              __MODS__[modId].func(__MODS__[modId].req, m, m.exports);
              if (typeof m.exports === "object") {
                  __MODS__[modId].m.exports.__proto__ = m.exports.__proto__;
                  Object.keys(m.exports).forEach(function(k) {
                      __MODS__[modId].m.exports[k] = m.exports[k];
                      Object.defineProperty(m.exports, k, { set: function(val) { __MODS__[modId].m.exports[k] = val; }, get: function() { return __MODS__[modId].m.exports[k]; } });
                  });
                  if (m.exports.__esModule) Object.defineProperty(__MODS__[modId].m.exports, "__esModule", { value: true });
              } else { __MODS__[modId].m.exports = m.exports; }
          }
          return __MODS__[modId].m.exports;
      };


      当前版本多了

      __MODS__[modId].m.exports.__proto__ = m.exports.__proto__;

      和循环内:

      Object.defineProperty(m.exportsk, { set: function (val) { __MODS__[modId].m.exports[k] = val; }, get: function () { return __MODS__[modId].m.exports[k]; } });

      这个就是导致冲突的原因。

      09-25
      1
      回复