国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

create-react-app 修改為多入口編譯的方法

2019-11-19 13:22:02
字體:
來源:轉載
供稿:網友

需求和出發點

我們會有較多的小的單頁應用,主要是一些簡單的頁面和活動之類。這些頁面相互之間沒有交集,但是會有一些可以共用的代碼,資源、接口、組件啥的。

對此,我們想到了兩種解決方案:

  • react-router 路由方案;
  • 同一個項目的多入口編譯;

針對我們的業務需求,其實 react-router 方案會有兩個小問題:

  • 單個活動的修改,其實需要編譯整個項目;
  • 若是不做編譯優化,整個項目的包會比較大,但其實沒必要,當然這個可以通過 react-router 的按需加載來解決;

權衡之下,我們還是選擇了第二個方案――改造項目成為多入口編譯。

文件結構設計

改進后,整個項目的結構大體如下:

- project  - build  - config  - public  - scripts  - src    - api    - component    - site      - site1        - index.html        - index.js        - ...      - site2        - index.html        - index.js        - ...  - package.json

site 文件夾下的所有文件夾都是一個獨立的項目,項目通用的代碼、資源被抽離到更外層的文件夾內,如 api、component 等,文件夾內都會有自己的 index.html 和 index.js,這會作為該項目的 html 模板和入口文件。下面,我們看下是如何修改編譯過程的。

修改入口和出口

編譯需要指定編譯的入口和輸出的位置,在 create-react-app 本來生成的 code 中,只有單入口和單出口,但是其實 webpack 是支持多入口、多出口的。

入口修改

create-react-app 命令生成的 config 文件夾中,有個 paths.js 文件,這里面 export 了比較常用的路徑。在這里,我對 src/site 文件夾內的文件夾進行了遍歷,生成為對象。具體代碼如下:

// all site pathsfunction allSitePath(source) { const { lstatSync, readdirSync } = fs const { join } = path const result = {} const isDirectory = source => lstatSync(source).isDirectory() readdirSync(source).map(name => {  let path = join(resolveApp(source), name)  if (isDirectory(path)) result[name] = path }) return result}module.exports = { ... allSites: allSitePath('src/site'),}

在 webpack.config.dev.js / webpack.config.prod.js 中找到 module.exports 的 entry 屬性,將其修改為:

// 動態生成 entryconst entry = {}Object.keys(paths.allSites).forEach(item => { entry[item] = [  require.resolve('./polyfills'),  require.resolve('react-dev-utils/webpackHotDevClient'),  require.resolve('react-error-overlay'),  paths.allSites[item] ]})module.exports = { ... entry: entry, ...}

出口修改

出口的修改分為兩部分,一部分是 module.exports 的 output,添加 name 以使靜態資源區分不同項目:

module.exports = { ... output: {  path: paths.appBuild,  pathinfo: true,  filename: 'static/js/[name].bundle.js',  chunkFilename: 'static/js/[name].chunk.js',  publicPath: publicPath,  devtoolModuleFilenameTemplate: info =>   path.resolve(info.absoluteResourcePath).replace(////g, '/'), }, ...} 

另一部分是 plugin 的修改,webpack 中,每個 HTML 文件的輸出,其實是一個 HtmlWebpackPlugin,我們需要添加多個 HtmlWebpackPlugin,以求生成多個 HTML:

// 動態生成 pluginsconst plugins = []Object.keys(paths.allSites).forEach(item => { plugins.push(new HtmlWebpackPlugin({  inject: true,  chunks: [item],  template: `${paths.allSites[item]}/index.html`,  filename: `${item}/index.html`, }))})module.exports = { ... plugins: [  ... ].concat(plugins),   ...}

修改 webpack Dev Server 配置

上述配置做完后,理論就可以打包出多入口的版本;但使用npm start啟動后,發現無論輸入/index.html還是/admin.html,好像都是和原來/index.html顯示一樣的內容。甚至輸入顯然不存在的/xxxx.html,也顯示為/index.html的內容。

這里,我們還需要修改 /config/webpackDevServer.config.js,做一些額外配置。

const rewrites = []Object.keys(paths.allSites).forEach(item => { rewrites.push({  from: new RegExp(`^///${item}/`, 'i'),  to: `/${item}/index.html`, })})...module.exports = function(proxy, allowedHost) { return {  ...  historyApiFallback: {   // Paths with dots should still use the history fallback.   // See https://github.com/facebookincubator/create-react-app/issues/387.   disableDotRule: true,   // 指明哪些路徑映射到哪個html   rewrites: rewrites,  },  ... };};

OK,到這里,整個改造就完成了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 定陶县| 嵩明县| 奇台县| 永吉县| 枣阳市| 忻州市| 鄂伦春自治旗| 长沙县| 西城区| 偏关县| 策勒县| 姜堰市| 德庆县| 长阳| 冀州市| 北辰区| 合作市| 沙田区| 贵阳市| 尚志市| 东乌珠穆沁旗| 南溪县| 嵊泗县| 延长县| 桂阳县| 溧阳市| 古蔺县| 亳州市| 双牌县| 曲麻莱县| 南投县| 藁城市| 仁寿县| 广宁县| 灵石县| 泸定县| 连山| 东光县| 襄樊市| 江永县| 利川市|