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

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

          /**
           * 將數(shù)組對(duì)象轉(zhuǎn)換成原始字符串
           
          */
          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('');
          }

          /**
           * 將對(duì)象轉(zhuǎn)換成原始字符串
           
          */
          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的配置字符串,并動(dòng)態(tài)執(zhí)行轉(zhuǎn)換成json對(duì)象; 修改相關(guān)的值信息為下邊的打包操作做準(zhǔn)備; 并將配置信息再轉(zhuǎn)成字符串形式寫到臨時(shí)文件下
          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);//將提取的字符串轉(zhuǎn)成mainCfg對(duì)象
          mainCfg.baseUrl = '/static/js/dist/lib';
          var nMainCfgStr = 'requirejs.config(' + object2strng(mainCfg, 0+ ');';//重新生成main.js配置文件,為下邊的打包做準(zhǔn)備
          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) {//這里提取所有的依賴模塊,打包時(shí)放到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
          執(zhí)行就可以了
          posted on 2016-11-01 16:24 SIMONE 閱讀(3905) 評(píng)論(0)  編輯  收藏 所屬分類: nodejs
          主站蜘蛛池模板: 信阳市| 玛多县| 彰武县| 龙陵县| 道真| 南华县| 项城市| 昌都县| 搜索| 尚义县| 唐海县| 绩溪县| 宜兴市| 嫩江县| 武宁县| 大港区| 榕江县| 巩义市| 锡林郭勒盟| 东明县| 二连浩特市| 吉木萨尔县| 三门县| 花莲县| 大余县| 格尔木市| 鹤壁市| 晋城| 石门县| 社会| 阳高县| 全南县| 深圳市| 定结县| 壶关县| 乌兰察布市| 文登市| 金乡县| 宜宾市| 紫阳县| 三原县|