小程序
小游戏
企业微信
微信支付
扫描小程序码分享
构建npm时报错:Uncaught TypeError: Cannot redefine property: settings
在引入pixi.js库的时候,出现这个错误。尝试了以前的代码,用旧版本的开发工具构建的npm没有问题,用当前版本构建的npm就会出现这个错误。
4 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
你好,反馈已收到,我们核实下,有进展会同步。
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
您好,请提供一下能复现问题的简单代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)。
https://developers.weixin.qq.com/s/t69HEEm978bB
需要npm install,然后npm构建一下。真正出错的代码就是
import * as PIXI from 'pixi.js';
我发布过一款使用pixijs开发的游戏,我把大约5个月前的代码拿出来测试了一下。在没有重新npm构建以前,代码运行正常。如果重新构建,那么就会出这类错误。
构建npm的__REQUIRE逻辑发生了变化:
// 旧版本:可运行版本
var
__REQUIRE__ =
function
(modId, source) {
if
(!__MODS__[modId])
return
require(source);
(!__MODS__[modId].status) {
m = { exports: {} };
__MODS__[modId].status = 1;
__MODS__[modId].func(__MODS__[modId].req, m, m.exports);
(
typeof
m.exports ===
"object"
) {
Object.keys(m.exports).forEach(
(k) {
__MODS__[modId].m.exports[k] = m.exports[k];
});
(m.exports.__esModule) Object.defineProperty(__MODS__[modId].m.exports,
"__esModule"
, { value:
true
}
else
{
__MODS__[modId].m.exports = m.exports;
__MODS__[modId].m.exports;
};
// 当前版本:出错版本
__MODS__[modId].m.exports.__proto__ = m.exports.__proto__;
Object.defineProperty(m.exports, k, { set:
(val) { __MODS__[modId].m.exports[k] = val; }, get:
() {
__MODS__[modId].m.exports[k]; } });
麻烦看一下谢谢!
楼主有进展吗?我也遇到了这个问题
google了一下这个问题似乎主要是由于Object.defineProperty函数引起的,我把两次npm构建的库的头部扒下来了:
首先是,可运行版本的:
module.exports = (
__MODS__ = {};
__DEFINE__ =
(modId, func, req) {
m = { exports: {} }; __MODS__[modId] = { status: 0, func: func, req: req, m: m }; };
m = { exports: {} }; __MODS__[modId].status = 1; __MODS__[modId].func(__MODS__[modId].req, m, m.exports);
) { Object.keys(m.exports).forEach(
(k) { __MODS__[modId].m.exports[k] = m.exports[k]; });
}); }
{ __MODS__[modId].m.exports = m.exports; } }
__MODS__[modId].m.exports; };
__REQUIRE_WILDCARD__ =
(obj) {
(obj && obj.__esModule) {
obj; }
newObj = {};
(obj !=
null
for
k
in
obj) {
(Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; } } newObj.
default
= obj;
newObj; } };
__REQUIRE_DEFAULT__ =
obj && obj.__esModule ? obj.
: obj; };
__DEFINE__(1555474367735,
(require, module, exports) {
下面是现在版本(出错版本的):
) { __MODS__[modId].m.exports.__proto__ = m.exports.__proto__; Object.keys(m.exports).forEach(
(k) { __MODS__[modId].m.exports[k] = m.exports[k]; Object.defineProperty(m.exports, k, { set:
__MODS__[modId].m.exports[k]; } }); });
__DEFINE__(1569398223144,
我又测试了一下,如果用可用版本的头部替换掉现在版本的,就不会报错了。新版本的构建npm是不是哪里的逻辑和配置做了修改,我们开发者需要那些注意的?总不能老是手工替换吧。
两种情况下的__REQUIRE__逻辑比较:
// 可运行版本:旧版本
{ __MODS__[modId].m.exports = m.exports; }
// 出错版本:当前版本
当前版本多了
和循环内:
Object.defineProperty(m.exports, k, { set: function (val) { __MODS__[modId].m.exports[k] = val; }, get: function () { return __MODS__[modId].m.exports[k]; } });
这个就是导致冲突的原因。
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
你好,反馈已收到,我们核实下,有进展会同步。
您好,请提供一下能复现问题的简单代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)。
https://developers.weixin.qq.com/s/t69HEEm978bB
需要npm install,然后npm构建一下。真正出错的代码就是
import * as PIXI from 'pixi.js';
我发布过一款使用pixijs开发的游戏,我把大约5个月前的代码拿出来测试了一下。在没有重新npm构建以前,代码运行正常。如果重新构建,那么就会出这类错误。
构建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;
};
麻烦看一下谢谢!
楼主有进展吗?我也遇到了这个问题
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) {
我又测试了一下,如果用可用版本的头部替换掉现在版本的,就不会报错了。新版本的构建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;
};
当前版本多了
__MODS__[modId].m.exports.__proto__ = m.exports.__proto__;
和循环内:
Object.defineProperty(m.exports, k, { set: function (val) { __MODS__[modId].m.exports[k] = val; }, get: function () { return __MODS__[modId].m.exports[k]; } });
这个就是导致冲突的原因。