dev-define.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /**
  2. * cmd 内部定义
  3. * 开发用
  4. */
  5. ( function ( global ) {
  6. var _modules = {},
  7. loaded = {};
  8. global.inc = {
  9. base: '',
  10. config: function ( options ) {
  11. this.base = options.base || '';
  12. },
  13. use: function ( id ) {
  14. return require( id );
  15. },
  16. remove: function ( node ) {
  17. node.parentNode.removeChild( node );
  18. }
  19. };
  20. global.define = function ( id, deps, f ) {
  21. var argLen = arguments.length,
  22. module = null;
  23. switch ( argLen ) {
  24. case 1:
  25. var scriptNode = document.getElementsByTagName( 'script' );
  26. f = id;
  27. id = scriptNode[ scriptNode.length - 1 ].getAttribute( "data-id" );
  28. break;
  29. case 2:
  30. if ( typeof id === 'string' ) {
  31. f = deps;
  32. } else {
  33. var scriptNode = document.getElementsByTagName( 'script' );
  34. f = deps;
  35. id = scriptNode[ scriptNode.length - 1 ].getAttribute( "data-id" );
  36. }
  37. break;
  38. }
  39. module = _modules[ id ] = {
  40. exports: {},
  41. value: null,
  42. factory: null
  43. };
  44. loadDeps( f );
  45. if ( typeof f === 'function' ) {
  46. module.factory = f;
  47. } else {
  48. module.value = f;
  49. }
  50. }
  51. function require ( id ) {
  52. var exports = {},
  53. module = _modules[ id ];
  54. if ( module.value ) {
  55. return module.value;
  56. }
  57. exports = module.factory( require, module.exports, module );
  58. if ( exports ) {
  59. module.exports = exports;
  60. }
  61. module.value = module.exports;
  62. module.exports = null;
  63. module.factory = null;
  64. return module.value;
  65. }
  66. function loadDeps ( factory ) {
  67. var deps = null,
  68. pathname = location.pathname,
  69. uri = location.protocol + '//' + location.host;
  70. pathname = pathname.split( '/');
  71. if ( pathname[ pathname.length - 1 ] !== '' ) {
  72. pathname[ pathname.length - 1 ] = '';
  73. }
  74. uri += pathname.join( '/' );
  75. if ( typeof factory === 'function' ) {
  76. deps = loadDepsByFunction( factory );
  77. } else {
  78. // 未处理object的情况
  79. return;
  80. }
  81. for ( var i = 0, len = deps.length; i < len; i++ ) {
  82. var key = deps[ i ];
  83. if ( loaded[ key ] ) {
  84. continue;
  85. }
  86. loaded[ key ] = true;
  87. document.write( '<script src="'+ uri + inc.base + '/' + key +'.js" onload="inc.remove(this)" data-id="'+ key +'"></script>' );
  88. }
  89. }
  90. function loadDepsByFunction ( factory ) {
  91. var content = factory.toString(),
  92. match = null,
  93. deps = [],
  94. pattern = /require\s*\(\s*([^)]+?)\s*\)/g;
  95. while ( match = pattern.exec( content ) ) {
  96. deps.push( match[ 1 ].replace( /'|"/g, '' ) );
  97. }
  98. return deps;
  99. }
  100. } )( this );