webpack.config.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. const path = require("path");
  2. const fs = require("fs");
  3. const { CleanWebpackPlugin } = require("clean-webpack-plugin");
  4. const JavascriptObfuscator = require("webpack-obfuscator");
  5. const AutoxHeaderWebpackPlugin = require("autox-header-webpack-plugin");
  6. const WatchDeployPlugin = require("autox-deploy-webpack-plugin");
  7. const CopyPlugin = require('copy-webpack-plugin');
  8. var scriptConfig = require('./scriptConfig.js');
  9. var headerFile = path.resolve(__dirname, scriptConfig.header);
  10. var headerText = fs.readFileSync(headerFile, "utf8").trim();
  11. var dist = "./dist";
  12. var entry = {};
  13. var copyPatterns = [];
  14. var projectsMain={};
  15. scriptConfig.projects.forEach(project => {
  16. if (!project.compile) {
  17. return false;
  18. }
  19. var projectName = project.name;
  20. var outProjectName = scriptConfig.projectPrefix + project.name;
  21. projectsMain[projectName]=project.main
  22. var entryPathName = path.posix.resolve(scriptConfig.baseDir, projectName, project.main);
  23. var outPathName = path.posix.resolve("/", outProjectName, project.main);
  24. outPathName = outPathName.replace(".js", "").replace('.ts','');
  25. entry[outPathName] = entryPathName;
  26. if(project.others){
  27. for (let index = 0; index < project.others.length; index++) {
  28. const fileName = project.others[index];
  29. const outFileName=path.posix.resolve("/", outProjectName, fileName).replace('.js','').replace('.ts','');
  30. entry[outFileName] = path.posix.resolve(scriptConfig.baseDir, projectName, fileName);
  31. }
  32. }
  33. //copy 文件
  34. var fromPath = path.posix.resolve(scriptConfig.baseDir, projectName).replace(/\\/g, '/') + "";
  35. var toPath = path.posix.resolve(dist, outProjectName).replace(/\\/g, '/') + "";
  36. var pattern = {
  37. from: fromPath,
  38. to: toPath,
  39. globOptions: {
  40. ignore: ['**/*.js', '**/*.ts']
  41. }
  42. };
  43. // console.error(pattern);
  44. copyPatterns.push(pattern);
  45. });
  46. module.exports = function (env, argv) {
  47. var prod = argv.mode == 'production'
  48. return {
  49. entry: entry,
  50. output: {
  51. filename: "[name].js",
  52. path: path.resolve(__dirname, dist),
  53. },
  54. target: scriptConfig.target,
  55. mode: argv.mode,
  56. devtool: prod ? 'none' : 'none',
  57. optimization: {
  58. minimize: false
  59. },
  60. plugins: [
  61. new JavascriptObfuscator({
  62. compact: prod,
  63. // // 压缩
  64. // compact: true,
  65. // // 控制流扁平化(降低50%速度)
  66. // controlFlowFlattening: false,
  67. // // 扁平化使用概率
  68. // controlFlowFlatteningThreshold: 0.75,
  69. // // 插入死代码
  70. // deadCodeInjection: false,
  71. // // 死代码影响率
  72. // deadCodeInjectionThreshold: 0.4,
  73. // // 阻止调试
  74. // debugProtection: false,
  75. // // 进阶阻止调试
  76. // debugProtectionInterval: false,
  77. // // 禁用console
  78. // disableConsoleOutput: false,
  79. // // 锁定代码,使其只能在本域名执行(复制到其他地方难以使用)
  80. // domainLock: [],
  81. // // 标识符混淆方式,hexadecimal(十六进制)、mangled(短标识符)
  82. // identifierNamesGenerator: 'hexadecimal',
  83. // // 标识符添加特定前缀
  84. // identifiersPrefix: '',
  85. // // 允许将信息记录到控制台
  86. // inputFileName: '',
  87. // log: false,
  88. // // 启用全局变量和函数名你的混淆
  89. // renameGlobals: false,
  90. // // 禁用模糊处理和生成标识符
  91. reservedNames: ['main'],
  92. // // 禁用数组内字符串的转换
  93. // reservedStrings: [],
  94. // // 通过固定和随机的位置移动数组,使解密的位置难以匹配,大文件应重点开启
  95. rotateStringArray: prod,
  96. seed: 0,
  97. // // 使混淆后的代码无法使用格式美化,需要保证compact为true
  98. // selfDefending: prod,
  99. // // 生成指引文件
  100. // sourceMap: false,
  101. // sourceMapBaseUrl: '',
  102. // sourceMapFileName: '',
  103. // sourceMapMode: 'separate',
  104. // // 删除字符串,并将它们放在一个数组中使用
  105. // stringArray: true,
  106. // // 编码字符串
  107. // stringArrayEncoding: true,
  108. // // 编码率
  109. stringArrayThreshold: 0.75,
  110. // // 生成的代码环境,可选Browser、Browser No Eval、Node
  111. target: 'node',
  112. // // 混淆对象键名
  113. // transformObjectKeys: false,
  114. // // 转义为Unicode,会大大增加体积,还原也比较容易,建议只对小文件使用
  115. // unicodeEscapeSequence: false,
  116. }),
  117. new AutoxHeaderWebpackPlugin({
  118. base64: scriptConfig.base64,
  119. advancedEngines: scriptConfig.advancedEngines,
  120. header: headerText
  121. }),
  122. new WatchDeployPlugin({
  123. type: scriptConfig.watch,
  124. projects:projectsMain
  125. }),
  126. new CleanWebpackPlugin({
  127. cleanStaleWebpackAssets: false,
  128. protectWebpackAssets: false,
  129. cleanOnceBeforeBuildPatterns: [],
  130. cleanAfterEveryBuildPatterns: ["bundle.js"],
  131. }),
  132. new CopyPlugin({
  133. patterns: copyPatterns,
  134. }),
  135. ],
  136. module: {
  137. rules: [
  138. {
  139. test: /\.js$/,
  140. exclude: /node_modules/,
  141. use: [
  142. {
  143. loader: "babel-loader",
  144. },
  145. {
  146. loader: "webpack-autojs-loader",
  147. }
  148. ],
  149. },
  150. {
  151. test: /\.ts$/,
  152. exclude: /node_modules/,
  153. use: {
  154. loader: "ts-loader",
  155. },
  156. },
  157. ],
  158. },
  159. };
  160. }