[关闭]
@bravf 2015-07-23T08:09:54.000000Z 字数 2288 阅读 1110

fis-easy-require 插件

前端架构


在fis-conf.js中添加如下插件代码

  1. fis.config.set('modules.parser.js', function (content, file, settings){
  2. var fs = require('fs')
  3. var path = require('path')
  4. var crypto = require('crypto')
  5. var modTable = []
  6. var modLinkTable = {}
  7. var scanReg = /require\(['|"](.*?)['|"]\)/g
  8. function getMd5(str){
  9. var md5 = crypto.createHash('md5')
  10. md5.update(str)
  11. return md5.digest('hex').slice(-8)
  12. }
  13. function getFullPath(p){
  14. var fullPath = path.join(__dirname, p)
  15. return fullPath
  16. }
  17. function getModFile(p){
  18. var fullPath = getFullPath(p)
  19. var content = fs.readFileSync(fullPath) + ''
  20. if (p in modLinkTable){
  21. for (var relpath in modLinkTable[p]){
  22. var abspath = modLinkTable[p][relpath]
  23. content = content.replace(RegExp(relpath, 'g'), getMd5(abspath.replace(/\\/g, '/')))
  24. }
  25. }
  26. var windowFunc = 'window["' + getMd5(p.replace(/\\/g, '/')) + '"]'
  27. return '//#----------------mod start----------------\n' +
  28. 'void function (module){\n\t' +
  29. windowFunc + '={};\n' +
  30. content.replace(/module\.exports/g, windowFunc).replace(/(^|\n)/g, '\n\t') +
  31. '\n}({exports:{}})\n' +
  32. '//#----------------mod end----------------\n\n'
  33. }
  34. function fillModLinkTable(subpath, requireNameA, requireNameB){
  35. if (!(subpath in modLinkTable)){
  36. modLinkTable[subpath] = {}
  37. }
  38. modLinkTable[subpath][requireNameA] = requireNameB
  39. }
  40. function scanMod(subpath){
  41. var modTable2 = []
  42. var modContent = fs.readFileSync(getFullPath(subpath)) + '';
  43. var execValue
  44. while ( (execValue = scanReg.exec(modContent)) != null ){
  45. var requireName = execValue[1]
  46. var modPath
  47. //如果rquire的是绝对路径
  48. if (requireName[0] == '/'){
  49. modPath = requireName
  50. }
  51. else {
  52. modPath = path.join(path.dirname(subpath), requireName)
  53. }
  54. fillModLinkTable(subpath, requireName, modPath)
  55. modTable2.push(modPath)
  56. }
  57. modTable2.forEach(function (mod){
  58. var idx = modTable.indexOf(mod)
  59. if (idx != -1){
  60. modTable.splice(idx, 1)
  61. }
  62. modTable.unshift(mod)
  63. scanMod(mod)
  64. })
  65. }
  66. //1、是js文件。2、文件名不能下划线打头(下划线的不被release出去)。3、min.js结尾的文件都直接被<script src>
  67. if ( (file.ext == '.js') && (file.filename[0] != '_') && (file.filename.slice(-4) != '.min') ){
  68. //console.log(file)
  69. modTable = []
  70. modLinkTable = {}
  71. scanMod(file.subpath)
  72. //把mods声明放到最前
  73. var modsContent = ''
  74. modTable.forEach(function (mod){
  75. modsContent += getModFile(mod)
  76. //watch
  77. fs.watch(getFullPath(mod), function (){
  78. var c = fs.readFileSync(file.fullname)
  79. fs.writeFileSync(file.fullname, c+'\n', 'utf-8')
  80. fs.writeFileSync(file.fullname, c, 'utf-8')
  81. })
  82. })
  83. content = modsContent + getModFile(file.subpath)
  84. //替换所有require
  85. content = content.replace(scanReg, function (match, value){
  86. return 'window["' + value + '"]'
  87. })
  88. }
  89. return content
  90. })
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注