publish.cjs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. const fs = require('fs')
  2. const { spawn } = require('child_process');
  3. const path = require('path');
  4. const main = () => {
  5. const params = process.argv.slice(2) || []
  6. const port = params[0] || ''
  7. const mode = params[1] || ''
  8. switch (port) {
  9. case 'h5':
  10. publish()
  11. break;
  12. case 'mp-weixin':
  13. if (mode == 'build') {
  14. handleWeappAddonComponents(mode)
  15. handleWeappLanguage(mode)
  16. } else if (mode == 'dev') {
  17. listenWeappRunDev()
  18. }
  19. break;
  20. }
  21. }
  22. const publish = () => {
  23. const src = './dist/build/h5'
  24. const dest = '../niucloud/public/wap'
  25. solve()
  26. // 目标目录不存在停止复制
  27. try {
  28. const dir = fs.readdirSync(dest)
  29. } catch (e) {
  30. return
  31. }
  32. // 删除目标目录下文件
  33. fs.rm(dest, { recursive: true }, err => {
  34. if(err) {
  35. console.log(err)
  36. return
  37. }
  38. fs.cp(src, dest, { recursive: true }, (err) => {
  39. if (err) {
  40. console.error(err)
  41. }
  42. })
  43. })
  44. }
  45. const solve = () => {
  46. const src = './dist/build/h5/assets'
  47. const filemaps = fs.readdirSync(src)
  48. filemaps.forEach(file => {
  49. if (/^(index-)(\w{8})(.js)$/.test(file)) {
  50. const path = `${src}/${file}`
  51. let content = fs.readFileSync(path, 'utf-8')
  52. const first = 'const match = location.href.match(/\\/wap\\/(\\d*)\\//);'
  53. if (content.indexOf(first) == -1) {
  54. content = first + content
  55. const replace = 'router:{mode:"history",base: match ? `/wap/${match[1]}/` : "/wap/",assets:"assets",routerBase: match ? `/wap/${match[1]}/` : "/wap/"},darkmode'
  56. content = content.replace(/router:{(.*?)},darkmode/s, replace)
  57. fs.writeFileSync(path, content, 'utf8')
  58. }
  59. }
  60. })
  61. }
  62. const handleWeappAddonComponents = (mode) => {
  63. const src = `./dist/${mode}/mp-weixin/addon/components/diy/group/index.json`
  64. try {
  65. const data = JSON.parse(fs.readFileSync(src, 'utf8'));
  66. data.componentPlaceholder = {};
  67. Object.keys(data.usingComponents).map(key => {
  68. data.componentPlaceholder[key] = "view";
  69. })
  70. fs.writeFileSync(src, JSON.stringify(data))
  71. } catch (err) {
  72. }
  73. }
  74. const handleWeappLanguage = (mode) => {
  75. const src = `./dist/${mode}/mp-weixin/locale/language.js`
  76. try {
  77. let content = fs.readFileSync(src, 'utf8');
  78. content = content.replace(/Promise\.resolve\(require\(("[^"]+")\)\)/g, 'require.async($1)')
  79. fs.writeFileSync(src, content)
  80. } catch (err) {
  81. console.log(err)
  82. }
  83. }
  84. const listenWeappRunDev = () => {
  85. const devProcess = spawn('npm', ['run', 'dev:niu-mp-weixin'], {
  86. stdio: ['pipe', 'pipe', 'pipe'],
  87. shell: true
  88. });
  89. let serverReady = false;
  90. // 监听 stdout 输出
  91. devProcess.stdout.on('data', (data) => {
  92. const message = data.toString();
  93. console.log(message)
  94. if (!serverReady && message.includes('DONE Build complete')) {
  95. serverReady = true;
  96. handleWeappAddonComponents('dev')
  97. handleWeappLanguage('dev')
  98. }
  99. });
  100. // 监听 stderr 输出,用于捕获错误信息
  101. devProcess.stderr.on('data', (data) => {
  102. console.error(data.toString());
  103. });
  104. // 监听子进程退出事件
  105. devProcess.on('close', (code) => {
  106. if (code !== 0) { // 如果退出码不是0,则认为发生了错误
  107. console.error(`Child process exited with code ${code}`);
  108. } else {
  109. console.log('Child process exited successfully.');
  110. }
  111. });
  112. }
  113. main()