create-react-app多應(yīng)用配置

改寫scripts腳本支持多應(yīng)用(MPA)開發(fā)

(use create-react-app@2.1.8

  1. 在不eject的情況下,安裝react-app-rewiredcustomize-cra,仍舊可以使用react-app-rewired編譯你的應(yīng)用為SPA
  2. 也可以通過eject直接改寫webpack.config和scripts腳本
  3. 可通過少量的改動合并為一個應(yīng)用

安裝react-app-rewiredcustomize-cra

npx add react-app-rewired customize-cra

根目錄下新增config-overrides.js

const { addBabelPlugin, addLessLoader } = require('customize-cra');

// override config
module.exports = (config) => {
    return config;
}

在項目根目錄下新增react.json

{
  "version": 1.0,
  "projects": {
    "main": {
      "name": "main",
      "path": ".",
      "publicPath": "",
      "index": "public/index.html",
      "main": "src/index.js"
    },
    "app1": {
      "name": "app1",
      "path": "app1",
      "publicPath": "app1/",
      "index": "public/index.html",
      "main": "src/app1/index.js"
    }
  }
}

新增util/index.js

const path = require('path');
const chalk = require('react-dev-utils/chalk');
const { paths } = require('react-app-rewired');
const configFactory = require(paths.scriptVersion + '/config/webpack.config');
const createDevServerConfig = require(paths.scriptVersion + '/config/webpackDevServer.config');
const override = require('../config-overrides');
let packageJson = require(path.join(paths.appPath,'react.json'));
let apps = packageJson.projects;
const argvs = process.argv.slice(2);
let currentApp = null;
// 通過參數(shù)--app指定應(yīng)用
argvs.some(arg => {
  if (arg.startsWith('--app=')) {
    const currentStr = arg.split('=')[1];
    if (!apps[currentStr]) {
      console.log(chalk.yellow(`${currentStr} is not in apps`));
      process.exit(1);
    } else {
      currentApp = {currentStr:apps[currentStr]};
      return true;
    }
  }
  return false;
});
const bpObj = currentApp?currentApp:apps;
const buildApps = [];
for(let key in bpObj){
  const config =configFactory(process.env.NODE_ENV);
  override(config);
  setAppConfig(config,bpObj[key]);
  bpObj[key]['config']=config;
  buildApps.push(bpObj[key]);
}
function setAppConfig(config, app) {
  config.entry[config.entry.length - 1] = path.join(paths.appPath, app.main);
  if(app.path){
    config.output.path = path.join(paths.appBuild, app.path);
  }
  // build時設(shè)置publicPath
  if(app.publicPath&&process.env.NODE_ENV!=="development"){
    config.output.publicPath = `${app.publicPath}/`;
  }
}
module.exports = {
  buildApps,
  createDevServerConfig,
  paths
};

復(fù)制react-scripts下的scripts腳本到根目錄下并修改start.js,build.js

checkBrowsers(buildPath, isInteractive)寫在function內(nèi)(buildApp)喉酌,以方便調(diào)用進行編譯

以build為例:


const async = require('async');
// src有多少個應(yīng)用,使用util/index.js下的paths代替原先的paths(刪除舊的require)
let { buildApps,paths } = require('../util');

let i = -1, len = buildApps.length;
// 使用async.waterfall依次打包react.json下的應(yīng)用
async.waterfall(buildApps.map(currentApp => {
  return (callback) => {
    i++;
    const config = currentApp['config'];
    let buildPath = path.join(paths.appBuild,currentApp.path);
    buildApp(currentApp, buildPath, config).then(() => {
      i == (len - 1) ? '' : callback();
    });
  }
}), (err, result) => {
  console.log(err);
});

修改package.json內(nèi)的scripts:

  "scripts": {
    "start": "node scripts/start.js",
    "app1":"node scripts/start.js --app=app1",
    "build": "node scripts/build.js",
    "test": "node scripts/test.js"
  },

打包的目錄如圖所示泵喘。


build.png

運行以下命令瀏覽應(yīng)用:

> cd build
> serve

github地址https://github.com/upcyoung/muti-project.git

原創(chuàng)文章泪电,轉(zhuǎn)載請保留或注明出處
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纪铺,隨后出現(xiàn)的幾起案子相速,更是在濱河造成了極大的恐慌,老刑警劉巖鲜锚,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件突诬,死亡現(xiàn)場離奇詭異,居然都是意外死亡芜繁,警方通過查閱死者的電腦和手機旺隙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骏令,“玉大人蔬捷,你說我怎么就攤上這事±拼” “怎么了周拐?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摘昌。 經(jīng)常有香客問我速妖,道長高蜂,這世上最難降的妖魔是什么聪黎? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮备恤,結(jié)果婚禮上稿饰,老公的妹妹穿的比我還像新娘。我一直安慰自己喉镰,他們只是感情好侣姆,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布生真。 她就那樣靜靜地躺著,像睡著了一般柱蟀。 火紅的嫁衣襯著肌膚如雪长已。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音撬讽,去河邊找鬼游昼。 笑死,一個胖子當著我的面吹牛廊佩,可吹牛的內(nèi)容都是我干的标锄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逊脯!你這毒婦竟也來了巩螃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎春缕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宅荤,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡庸汗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片句旱。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡畅涂,死狀恐怖立宜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灯帮,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布腻贰,位于F島的核電站,受9級特大地震影響扒秸,放射性物質(zhì)發(fā)生泄漏播演。R本人自食惡果不足惜写烤,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一拾徙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叁温。三九已至,卻和暖如春膝但,著一層夾襖步出監(jiān)牢的瞬間跟束,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工丑孩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泳炉,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓嚎杨,卻偏偏與公主長得像花鹅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子枫浙,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容