taro build --type weapp --watch
微信小程序编译,怎么一会就会报这个错误停止编译
Maximum call stack size exceeded
显示这个错误之后都无法编译每次保存文件都出现这个提示

CC @luckyadam
欢迎提交 Issue~
如果你提交的是 bug 报告,请务必遵循 Issue 模板的规范,尽量用简洁的语言描述你的问题,最好能提供一个稳定简单的复现。🙏🙏🙏
如果你的信息提供过于模糊或不足,或者已经其他 issue 已经存在相关内容,你的 issue 有可能会被关闭。
Good luck and happy coding~
Taro 版本是多少,以及 Taro 相关的提依赖版本是多少?
@luckyadam
2.0.2
~~~
{
"name": "duxShopApp",
"version": "1.0.0",
"private": true,
"description": "多端统一的duxShop商城系统",
"templateInfo": {
"name": "redux",
"typescript": false,
"css": "sass"
},
"scripts": {
"build:weapp": "taro build --type weapp",
"build:swan": "taro build --type swan",
"build:alipay": "taro build --type alipay",
"build:tt": "taro build --type tt",
"build:h5": "taro build --type h5",
"build:rn": "taro build --type rn",
"build:qq": "taro build --type qq",
"build:quickapp": "taro build --type quickapp",
"dev:weapp": "npm run build:weapp -- --watch",
"dev:swan": "npm run build:swan -- --watch",
"dev:alipay": "npm run build:alipay -- --watch",
"dev:tt": "npm run build:tt -- --watch",
"dev:h5": "npm run build:h5 -- --watch",
"dev:rn": "npm run build:rn -- --watch",
"dev:qq": "npm run build:qq -- --watch",
"dev:quickapp": "npm run build:quickapp -- --watch"
},
"author": "",
"license": "MIT",
"dependencies": {
"@tarojs/components": "2.0.2",
"@tarojs/components-qa": "2.0.2",
"@tarojs/components-rn": "2.0.2",
"@tarojs/redux": "2.0.2",
"@tarojs/redux-h5": "2.0.2",
"@tarojs/router": "2.0.2",
"@tarojs/taro": "2.0.2",
"@tarojs/taro-alipay": "2.0.2",
"@tarojs/taro-h5": "2.0.2",
"@tarojs/taro-qq": "2.0.2",
"@tarojs/taro-quickapp": "2.0.2",
"@tarojs/taro-redux-rn": "2.0.2",
"@tarojs/taro-rn": "2.0.2",
"@tarojs/taro-router-rn": "2.0.2",
"@tarojs/taro-swan": "2.0.2",
"@tarojs/taro-tt": "2.0.2",
"@tarojs/taro-weapp": "2.0.2",
"babel-runtime": "^6.26.0",
"crypto-js": "^3.1.9-1",
"nerv-devtools": "^1.5.6",
"nervjs": "^1.5.6",
"react": "16.3.1",
"react-native": "0.55.4",
"redux": "^4.0.0",
"redux-logger": "^3.0.6",
"redux-thunk": "^2.3.0",
"tslib": "^1.8.0"
},
"devDependencies": {
"@tarojs/mini-runner": "2.0.2",
"@tarojs/webpack-runner": "2.0.2",
"@types/react": "^16.4.8",
"@types/webpack-env": "^1.13.6",
"babel-eslint": "^8.2.3",
"babel-plugin-transform-class-properties": "^6.24.1",
"babel-plugin-transform-decorators-legacy": "^1.3.4",
"babel-plugin-transform-jsx-stylesheet": "^0.6.5",
"babel-plugin-transform-object-rest-spread": "^6.26.0",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-preset-env": "^1.6.1",
"eslint": "^5.16.0",
"eslint-config-taro": "2.0.2",
"eslint-plugin-import": "^2.12.0",
"eslint-plugin-react": "^7.8.2",
"eslint-plugin-react-hooks": "^1.6.1",
"eslint-plugin-taro": "2.0.2",
"stylelint": "9.3.0",
"stylelint-config-taro-rn": "2.0.2",
"stylelint-taro-rn": "2.0.2"
}
}
~~~
@luckyadam
2.0.2{ "name": "duxShopApp", "version": "1.0.0", "private": true, "description": "多端统一的duxShop商城系统", "templateInfo": { "name": "redux", "typescript": false, "css": "sass" }, "scripts": { "build:weapp": "taro build --type weapp", "build:swan": "taro build --type swan", "build:alipay": "taro build --type alipay", "build:tt": "taro build --type tt", "build:h5": "taro build --type h5", "build:rn": "taro build --type rn", "build:qq": "taro build --type qq", "build:quickapp": "taro build --type quickapp", "dev:weapp": "npm run build:weapp -- --watch", "dev:swan": "npm run build:swan -- --watch", "dev:alipay": "npm run build:alipay -- --watch", "dev:tt": "npm run build:tt -- --watch", "dev:h5": "npm run build:h5 -- --watch", "dev:rn": "npm run build:rn -- --watch", "dev:qq": "npm run build:qq -- --watch", "dev:quickapp": "npm run build:quickapp -- --watch" }, "author": "", "license": "MIT", "dependencies": { "@tarojs/components": "2.0.2", "@tarojs/components-qa": "2.0.2", "@tarojs/components-rn": "2.0.2", "@tarojs/redux": "2.0.2", "@tarojs/redux-h5": "2.0.2", "@tarojs/router": "2.0.2", "@tarojs/taro": "2.0.2", "@tarojs/taro-alipay": "2.0.2", "@tarojs/taro-h5": "2.0.2", "@tarojs/taro-qq": "2.0.2", "@tarojs/taro-quickapp": "2.0.2", "@tarojs/taro-redux-rn": "2.0.2", "@tarojs/taro-rn": "2.0.2", "@tarojs/taro-router-rn": "2.0.2", "@tarojs/taro-swan": "2.0.2", "@tarojs/taro-tt": "2.0.2", "@tarojs/taro-weapp": "2.0.2", "babel-runtime": "^6.26.0", "crypto-js": "^3.1.9-1", "nerv-devtools": "^1.5.6", "nervjs": "^1.5.6", "react": "16.3.1", "react-native": "0.55.4", "redux": "^4.0.0", "redux-logger": "^3.0.6", "redux-thunk": "^2.3.0", "tslib": "^1.8.0" }, "devDependencies": { "@tarojs/mini-runner": "2.0.2", "@tarojs/webpack-runner": "2.0.2", "@types/react": "^16.4.8", "@types/webpack-env": "^1.13.6", "babel-eslint": "^8.2.3", "babel-plugin-transform-class-properties": "^6.24.1", "babel-plugin-transform-decorators-legacy": "^1.3.4", "babel-plugin-transform-jsx-stylesheet": "^0.6.5", "babel-plugin-transform-object-rest-spread": "^6.26.0", "babel-plugin-transform-runtime": "^6.23.0", "babel-preset-env": "^1.6.1", "eslint": "^5.16.0", "eslint-config-taro": "2.0.2", "eslint-plugin-import": "^2.12.0", "eslint-plugin-react": "^7.8.2", "eslint-plugin-react-hooks": "^1.6.1", "eslint-plugin-taro": "2.0.2", "stylelint": "9.3.0", "stylelint-config-taro-rn": "2.0.2", "stylelint-taro-rn": "2.0.2" } }
升级到 2.0.3 再试试,如果不行的话,提供一下复现步骤
升级了依然会出现,我不知道是不是因为这个项目文件太多导致的,或者电脑配置不够什么的 @luckyadam
同问,我也遇到了这个问题,监听过程中总会出现Maximum call stack size exceeded
同问
我也遇到了,会不会是这个问题呢?

2.0.3 同问
2.0.3同问
提供一下复现步骤,最好能提供个测试的 demo
2.0.3 同问
提供一下复现步骤,最好能提供个测试的 demo
升级到V2.0.4好像还是存在这个问题
@MrXia1993 求一个复现的 demo,真的难以复现
也许是文件不够多 @luckyadam
@luckyadam 目前项目执行yarn dev:weapp后,单开任一文件,然后保存18次,就会出现
是18次吗,我怎么感觉我的不用这么多次也会出现 @MrXia1993
@ShaoGongBra 那就更不好查了 我这边试了好多次 我这边是这个情况 运行之后总是保存18次就挂了
升级到2.0.5发现问题依然存在 我把项目切了个分支出去 然后只留tabbar四个页面 发现还是存在监听报错的问题 目前有个猜想是页面的私有组件太多导致监听出现的问题 像首页里面的私有组件就很多 @luckyadam
也许是文件不够多 @luckyadam
猜测可能真是文件不够多的原因,目前在网上搜索到一个相同的报错信息,是一致的报错的堆栈
https://github.com/vuejs/vue-cli/issues/3091
issue 中提出的解决办法是开发时关闭 css 抽离,猜测是抽离文件文件过多过大导致的问题,但是小程序开发时不能关闭 css 抽离,所以具体解决方案有待进一步探索~
大家可以在这里多多讨论一下
附上 Maximum call stack size exceeded 报错的完整堆栈信息

如果可以的话,可以试下安装 circular-dependency-plugin 这个 插件,来看看是否有循环依赖的情况
https://github.com/webpack/webpack/issues/7731#issuecomment-478919567
之前我用child_process的时候也碰到过这个情况的,子进程默认的buffer大小是200*1024,稍微复杂一点的项目多保存几次就会出现了,可以加大maxBuffer的配置试试看
process.exec('npm run start', {
maxBuffer: 5000 * 1024 // 配置更大的buffer,默认 200 * 1024
},()=>{})
同问:太影响开发了 不敢保存
Taro CLI 2.0.4 environment info:
System:
OS: macOS 10.15.3
Shell: 5.7.1 - /bin/zsh
Binaries:
Node: 12.16.1 - ~/.nvm/versions/node/v12.16.1/bin/node
Yarn: 1.22.0 - /usr/local/bin/yarn
npm: 6.13.4 - ~/.nvm/versions/node/v12.16.1/bin/npm
npmPackages:
@tarojs/cli: 2.0.4 => 2.0.4
@tarojs/components: 2.0.4 => 2.0.4
@tarojs/mini-runner: 2.0.4 => 2.0.4
@tarojs/mobx: 2.0.4 => 2.0.4
@tarojs/mobx-h5: 2.0.4 => 2.0.4
@tarojs/mobx-rn: 2.0.4 => 2.0.4
@tarojs/plugin-babel: 2.0.4 => 2.0.4
@tarojs/plugin-csso: 2.0.4 => 2.0.4
@tarojs/plugin-less: 2.0.4 => 2.0.4
@tarojs/plugin-uglifyjs: 2.0.4 => 2.0.4
@tarojs/rn-runner: 2.0.4 => 2.0.4
@tarojs/router: 2.0.4 => 2.0.4
@tarojs/taro: 2.0.4 => 2.0.4
@tarojs/taro-alipay: 2.0.4 => 2.0.4
@tarojs/taro-h5: 2.0.4 => 2.0.4
@tarojs/taro-swan: 2.0.4 => 2.0.4
@tarojs/taro-tt: 2.0.4 => 2.0.4
@tarojs/taro-weapp: 2.0.4 => 2.0.4
@tarojs/webpack-runner: 2.0.4 => 2.0.4
eslint-config-taro: 2.0.4 => 2.0.4
eslint-plugin-taro: 2.0.4 => 2.0.4
nerv-devtools: ^1.5.6 => 1.5.6
nervjs: ^1.5.6 => 1.5.6
stylelint-config-taro-rn: 2.0.4 => 2.0.4
stylelint-taro-rn: 2.0.4 => 2.0.4
同问:太影响开发了 不敢保存
Taro CLI 2.0.4 environment info:
System:
OS: macOS 10.15.3
Shell: 5.7.1 - /bin/zsh
Binaries:
Node: 12.16.1 - ~/.nvm/versions/node/v12.16.1/bin/node
Yarn: 1.22.0 - /usr/local/bin/yarn
npm: 6.13.4 - ~/.nvm/versions/node/v12.16.1/bin/npm
npmPackages:
@tarojs/cli: 2.0.4 => 2.0.4
@tarojs/components: 2.0.4 => 2.0.4
@tarojs/mini-runner: 2.0.4 => 2.0.4
@tarojs/mobx: 2.0.4 => 2.0.4
@tarojs/mobx-h5: 2.0.4 => 2.0.4
@tarojs/mobx-rn: 2.0.4 => 2.0.4
@tarojs/plugin-babel: 2.0.4 => 2.0.4
@tarojs/plugin-csso: 2.0.4 => 2.0.4
@tarojs/plugin-less: 2.0.4 => 2.0.4
@tarojs/plugin-uglifyjs: 2.0.4 => 2.0.4
@tarojs/rn-runner: 2.0.4 => 2.0.4
@tarojs/router: 2.0.4 => 2.0.4
@tarojs/taro: 2.0.4 => 2.0.4
@tarojs/taro-alipay: 2.0.4 => 2.0.4
@tarojs/taro-h5: 2.0.4 => 2.0.4
@tarojs/taro-swan: 2.0.4 => 2.0.4
@tarojs/taro-tt: 2.0.4 => 2.0.4
@tarojs/taro-weapp: 2.0.4 => 2.0.4
@tarojs/webpack-runner: 2.0.4 => 2.0.4
eslint-config-taro: 2.0.4 => 2.0.4
eslint-plugin-taro: 2.0.4 => 2.0.4
nerv-devtools: ^1.5.6 => 1.5.6
nervjs: ^1.5.6 => 1.5.6
stylelint-config-taro-rn: 2.0.4 => 2.0.4
stylelint-taro-rn: 2.0.4 => 2.0.4
暂时参考一下楼上的解决方案
之前我用child_process的时候也碰到过这个情况的,子进程默认的buffer大小是200*1024,稍微复杂一点的项目多保存几次就会出现了,可以加大maxBuffer的配置试试看
process.exec('npm run start', { maxBuffer: 5000 * 1024 // 配置更大的buffer,默认 200 * 1024 },()=>{})
这个怎么使用,代码写在哪里呢
之前我用child_process的时候也碰到过这个情况的,子进程默认的buffer大小是200*1024,稍微复杂一点的项目多保存几次就会出现了,可以加大maxBuffer的配置试试看
process.exec('npm run start', { maxBuffer: 5000 * 1024 // 配置更大的buffer,默认 200 * 1024 },()=>{})这个怎么使用,代码写在哪里呢
自己加一个 start.js 的文件,然后把代码放进去
const { exec } = require('child_process')
exec('npm run dev:weapp', {
maxBuffer: 5000 * 1024 // 配置更大的buffer,默认 1024 * 1024
}, (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`)
return
}
console.log(`stdout: ${stdout}`)
console.error(`stderr: ${stderr}`)
})
然后执行 start.js
目前暂时性解决方案有两个
长期解决方案,有待替换掉 mini-css-extract-plugin 这个插件
我也遇到了,无法解决,taro 2.0.4。
我的是在render方法中定义变量引用了this.state。
去掉后就好了,直接用this.state来取数据。
之前我用child_process的时候也碰到过这个情况的,子进程默认的buffer大小是200*1024,稍微复杂一点的项目多保存几次就会出现了,可以加大maxBuffer的配置试试看
process.exec('npm run start', { maxBuffer: 5000 * 1024 // 配置更大的buffer,默认 200 * 1024 },()=>{})这个怎么使用,代码写在哪里呢
自己加一个 start.js 的文件,然后把代码放进去
const { exec } = require('child_process') exec('npm run dev:weapp', { maxBuffer: 5000 * 1024 // 配置更大的buffer,默认 1024 * 1024 }, (error, stdout, stderr) => { if (error) { console.error(`exec error: ${error}`) return } console.log(`stdout: ${stdout}`) console.error(`stderr: ${stderr}`) })然后执行 start.js
试过了没有用,也不知道是不是因为项目配置的命令跟脚手架的不太一样的原因。。。
--max-old-space-size和child_process的方式都试过了,没有用,文件比较多,编译两次之后就会报Maximum call stack size exceeded
之前我用child_process的时候也碰到过这个情况的,子进程默认的buffer大小是200*1024,稍微复杂一点的项目多保存几次就会出现了,可以加大maxBuffer的配置试试看
process.exec('npm run start', { maxBuffer: 5000 * 1024 // 配置更大的buffer,默认 200 * 1024 },()=>{})这个怎么使用,代码写在哪里呢
自己加一个 start.js 的文件,然后把代码放进去
const { exec } = require('child_process') exec('npm run dev:weapp', { maxBuffer: 5000 * 1024 // 配置更大的buffer,默认 1024 * 1024 }, (error, stdout, stderr) => { if (error) { console.error(`exec error: ${error}`) return } console.log(`stdout: ${stdout}`) console.error(`stderr: ${stderr}`) })然后执行 start.js
试过了没有用,也不知道是不是因为项目配置的命令跟脚手架的不太一样的原因。。。
不行+1
3.0的会不会这个错误
目前暂时性解决方案有两个
- 拓展 npm run 命令执行的内存空间,可以参考一下这里 npm/npm#12238 (comment)
- 减少 dev 时编译的页面数量,比如只监听少数几个页面
长期解决方案,有待替换掉 mini-css-extract-plugin 这个插件
如何减少页面监听数量
目前暂时性解决方案有两个
- 拓展 npm run 命令执行的内存空间,可以参考一下这里 npm/npm#12238 (comment)
- 减少 dev 时编译的页面数量,比如只监听少数几个页面
长期解决方案,有待替换掉 mini-css-extract-plugin 这个插件
如何减少页面监听数量
app.tsx 注释一部分跟开发无关的页面
2.0.7也存在这个问题
3.0.2 也存在这个问题
Most helpful comment
之前我用child_process的时候也碰到过这个情况的,子进程默认的buffer大小是200*1024,稍微复杂一点的项目多保存几次就会出现了,可以加大maxBuffer的配置试试看