posts - 495,comments - 227,trackbacks - 0
          var path = require('path');
          var fs = require('fs');
          var vm = require('vm');
          var os = require('os');

          /**
           * 格式化縮進的個數
           
          */
          function toIndent(indent) {
              
          var s = [];
              
          for (var i = 0; i < indent; i++) {
                  s.push('\t');
              }
              
          return s.join('');
          }

          /**
           * 將數組對象轉換成原始字符串
           
          */
          function array2string(arr, indent) {
              
          var s = ['[', os.EOL], hasProp = false;
              
          for (var i = 0; i < arr.length; i++) {
                  
          if (!hasProp) {
                      hasProp 
          = true;
                  }

                  s.push(toIndent(indent 
          + 1));

                  
          var item = arr[i];
                  
          var itemtp = typeof(item);
                  
          if (itemtp === 'object') {
                      
          if (item instanceof Array) {
                          s.push(array2string(item, indent 
          + 1));
                      } 
          else {
                          s.splice(s.length 
          - 22);
                          s.push(object2strng(item, indent).trim());
                      }
                  } 
          else {
                      s.push(JSON.stringify(item));
                  }
                  s.push(',');
                  s.push(os.EOL);
              }
              
          if (hasProp) {
                  s.splice(s.length 
          - 21);
              }
              s.push(toIndent(indent));
              s.push(']');
              
          return s.join('');
          }

          /**
           * 將對象轉換成原始字符串
           
          */
          function object2strng(obj, indent) {
              
          var s = ['{', os.EOL], hasProp = false;

              
          for (var o in obj) {
                  
          if (!hasProp) {
                      hasProp 
          = true;
                  }
                  s.push(toIndent(indent 
          + 1));
                  s.push(JSON.stringify(o));
                  s.push(':');

                  
          var tp = typeof(obj[o]);
                  
          if (tp === 'object') {
                      
          if (obj[o] instanceof Array) {
                          s.push(array2string(obj[o], indent 
          + 1));
                      } 
          else {
                          s.push(object2strng(obj[o], indent 
          + 1));
                      }
                  } 
          else if (tp === 'function') {
                      s.push(obj[o].toString());
                  } 
          else {
                      s.push(JSON.stringify(obj[o]));
                  }
                  s.push(',');
                  s.push(os.EOL);
              }
              
          if (hasProp) {
                  s.splice(s.length 
          - 21);
              }
              s.push(toIndent(indent));
              s.push('}');
              
          return s.join('');
          }

          //提取正式代碼里的requirejs的配置字符串,并動態執行轉換成json對象; 修改相關的值信息為下邊的打包操作做準備; 并將配置信息再轉成字符串形式寫到臨時文件下
          var mainPath = path.resolve(process.cwd(), '../js/main.js');
          var mainContent = fs.readFileSync(mainPath, 'utf-8').replace(/(requirejs\.config\()?([^)]]*)(\);)?/gm, '$2');
          vm.runInThisContext('
          var mainCfg= ' + mainContent);//將提取的字符串轉成mainCfg對象
          mainCfg.baseUrl = '/static/js/dist/lib';
          var nMainCfgStr = 'requirejs.config(' + object2strng(mainCfg, 0+ ');';//重新生成main.js配置文件,為下邊的打包做準備
          var buildPath = path.resolve(process.cwd(), './main.js');
          fs.writeFileSync(buildPath, nMainCfgStr);
          console.log('write temp file main.js fininshed');

          //打包的配置信息
          var buildJson = {
              appDir: '..
          /js',
              baseUrl: 'lib',
              mainConfigFile: '.
          /main.js',
              dir: '..
          /js/dist',
              modules: [{
                  'name': '..
          /main',
                  include: []
              }]
          };
          for (var p in mainCfg.paths) {//這里提取所有的依賴模塊,打包時放到main.js文件下
              buildJson.modules[0].include.push(p);
          }

          var buildPath = path.resolve(process.cwd(), './build_main.json');
          fs.writeFileSync(buildPath, object2strng(buildJson, 
          0));//生成打包配置文件
          console.log('wirte temp file build_main.json fininshed');



          寫一批處理文件build.bat
          @echo off
          node build.js
          node r.js -o build_main.json
          @pause
          執行就可以了
          posted on 2016-11-01 16:24 SIMONE 閱讀(3905) 評論(0)  編輯  收藏 所屬分類: nodejs
          主站蜘蛛池模板: 中宁县| 郯城县| 肥西县| 巴青县| 富裕县| 萍乡市| 南陵县| 集安市| 和林格尔县| 荣成市| 曲周县| 长汀县| 吴旗县| 太仆寺旗| 龙游县| 永定县| 旌德县| 兴山县| 长岛县| 合阳县| 贵港市| 涟源市| 衡东县| 金寨县| 闽清县| 搜索| 织金县| 惠来县| 南丰县| 曲水县| 梁平县| 休宁县| 麦盖提县| 鄱阳县| 拜泉县| 平度市| 丹寨县| 东光县| 福鼎市| 紫金县| 佛冈县|