react+webpack+react-router+redux項(xiàng)目搭建(一)

在本搭建項(xiàng)目過(guò)程中有考慮到 React負(fù)責(zé)UI渲染诅诱,還需要用redux來(lái)管理數(shù)據(jù)髓堪,使用es6,webpack娘荡,為了提高性能干旁,需要按需加載,還有immutable.js炮沐、單元測(cè)試等等争群。下面將會(huì)詳細(xì)介紹

搭建項(xiàng)目流程

1 > mkdir dataProject && cd dataProject
2 > npm init
3 > npm install webpack --save-dev

注: --save-dev 與 –save的區(qū)別
--save-dev 開(kāi)發(fā)時(shí)候依賴的東西,放在package.json的devDependencies模塊大年,--save 發(fā)布之后還依賴的東西换薄,放在dependencies模塊玉雾。
比如,你寫 ES6 代碼轻要,如果你想編譯成 ES5 發(fā)布那么 babel 就是devDependencies复旬。
如果你用了jQuery,由于發(fā)布之后還是依賴jQuery冲泥,所以是dependencies赢底。但是在 npm 里面除了二進(jìn)制的依賴,似乎也不用區(qū)分是不是dev柏蘑。因?yàn)槭褂胣pm就是自己編譯的意思,而不使用npm直接拿編譯后的版本的粹庞,這些依賴項(xiàng)也看不到咳焚。

4 webpack配置

a. entry和output
entry: webpack 應(yīng)該使用哪個(gè)模塊,來(lái)作為構(gòu)建其內(nèi)部依賴圖的開(kāi)始庞溜「锇耄可根據(jù)它的屬性定義設(shè)置單入口應(yīng)用程序、分離應(yīng)用程序流码、多頁(yè)面程序又官。
output: 配置 output 選項(xiàng)可以控制 webpack 如何向硬盤寫入編譯文件。filename 用于輸出文件的文件名漫试。目標(biāo)輸出目錄 path 的絕對(duì)路徑六敬。

const config = {
    entry: path.join(__dirname, 'src/index.js'),
    output:{
      path: path.join(__dirname, 'dist'),
      filename: 'app.js'
  }}

學(xué)會(huì)使用webpack
在package.json中的script屬性設(shè)置命令:
"build": "webpack --config webpack.config.js"
運(yùn)行 npm run build,會(huì)發(fā)現(xiàn)多了一個(gè)dist文件夾驾荣,其內(nèi)部包含一個(gè)app.js文件
dist文件夾下面新建一個(gè)app.html
dist/app.html填寫內(nèi)容

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<div id="app"></div>
<script type="text/javascript" src="./app.js" charset="utf-8"></script>
</body>
</html>

用瀏覽器打開(kāi)app.html外构,會(huì)發(fā)現(xiàn)src內(nèi)部的index.js內(nèi)容被編譯到了app.js。

b. loader
loader讓webpack 能夠去處理那些非JavaScript 文件播掷,可以將所有類型的文件轉(zhuǎn)換為 webpack 能夠處理的有效模塊审编,然后你就可以利用 webpack 的打包能力,對(duì)它們進(jìn)行處理歧匈。實(shí)質(zhì)上是垒酬,將所有類型的文件,轉(zhuǎn)換為應(yīng)用程序依賴圖可以直接引用的模塊件炉。
比如npm install --save-dev css-loader勘究,告訴webpack加載css文件。

loader: [
    {
        test: /\.css$/,
        loader: 'style-loader!css-loader'
    },{
        test: /\.(png|jpg|gif|woff|woff2)$/,
        loader: 'url-loader?limit=8192'
    },{
        test: /\.(mp4|ogg|svg)$/,
        loader: 'file-loader'
    },{
        test:/\.json$/,
        loader:'json-loader'
      }
  ]

loader 支持鏈?zhǔn)絺鬟f妻率。能夠?qū)Y源使用流水線(pipeline)乱顾。一組鏈?zhǔn)降?loader 將按照先后順序進(jìn)行編譯。
一個(gè)loader預(yù)期導(dǎo)出一個(gè)函數(shù)宫静,而且是用兼容javascript的nodepgn
c.(后續(xù)補(bǔ)充)

d.plugin
webpack 插件是一個(gè)具有 apply 屬性的 JavaScript 對(duì)象走净。apply 屬性會(huì)被 webpack compiler 調(diào)用券时,并且 compiler 對(duì)象可在整個(gè)編譯生命周期訪問(wèn)

const webpack = require('webpack'); //訪問(wèn)內(nèi)置的插件
      const HtmlWebpackPlugin = require('html-webpack-plugin'); //通過(guò) npm 安裝
let BowerWebpackPlugin = require('bower-webpack-plugin');
plugins: [
        new webpack.optimize.UglifyJsPlugin(),
        new HtmlWebpackPlugin({template: './src/index.html'}),
new BowerWebpackPlugin({
            searchResolveModulesDirectories: false
        })
     ]

解析:
HtmlWebpackPlugin:自動(dòng)生成一個(gè)HTML文件,并引用相關(guān)的assets文件伏伯。
webpack.optimize.UglifyJsPlugin():壓縮插件橘洞,優(yōu)化縮小js包體積。
webpack.optimize.CommonsChunkPlugin():提取公共代碼塊说搅。webpack的資源入口通常是以entry為單元進(jìn)行編譯提取炸枣,那么當(dāng)多entry共存的時(shí)候,它可以對(duì)所有依賴的chunk以module為單位進(jìn)行公共部分的提取弄唧∈食Γ可以向其內(nèi)部輸入?yún)?shù)來(lái)設(shè)置提取所有入口的公共部分,也可以提取部分公共部分候引『钛可以實(shí)現(xiàn):
①多入口,模塊重復(fù)引用澄干,分文件輸出(將多次引用的模塊打包到公共模塊)
②將公共業(yè)務(wù)模塊與類庫(kù)或框架分開(kāi)打包逛揩;
(見(jiàn)https://segmentfault.com/a/1190000006808865
延伸:如何解決webpack大包體積過(guò)大
e.resolve
設(shè)置模塊如何被解析,其常用屬性有:
Alias:創(chuàng)建 import 或 require 的別名麸俘,來(lái)確保模塊引入變得更簡(jiǎn)單
extension:自動(dòng)解析擴(kuò)展辩稽,能夠使用戶在引入模塊時(shí)不帶擴(kuò)展,默認(rèn)有[‘.js’,’.json’]从媚。
plugins:應(yīng)該使用的額外的解析插件列表
e.devServer
webpack-dev-server 能夠用于快速開(kāi)發(fā)應(yīng)用程序逞泄,使用方法

devServer: {
    contentBase: './src/',
    historyApiFallback: true,
    hot: true,
    port: defaultSettings.port,
    publicPath: defaultSettings.publicPath,
    noInfo: false
  }

contentBase:告訴服務(wù)器從哪里提供內(nèi)容。只有在你想要提供靜態(tài)文件時(shí)才需要静檬。
historyApiFallback:當(dāng)使用 HTML5 History API 時(shí)炭懊,任意的 404 響應(yīng)都可能需要被替代為 index.html,則其值為true拂檩。通過(guò)傳入一個(gè)對(duì)象侮腹,比如使用 rewrites 這個(gè)選項(xiàng),此行為可進(jìn)一步地控制稻励。
hot:?jiǎn)⒂?webpack 的模塊熱替換特性
port:指定要監(jiān)聽(tīng)請(qǐng)求的端口號(hào)
publicPath:此路徑下的打包文件可在瀏覽器中訪問(wèn)
noInfo:當(dāng)為true時(shí)父阻,啟用 noInfo 后,諸如「啟動(dòng)時(shí)和每次保存之后望抽,那些顯示的 webpack 包(bundle)信息」的消息將被隱藏加矛。錯(cuò)誤和警告仍然會(huì)顯示。
lazy:當(dāng)啟用 lazy 時(shí)煤篙,dev-server 只有在請(qǐng)求時(shí)才編譯包(bundle)斟览。這意味著 webpack 不會(huì)監(jiān)視任何文件改動(dòng)。我們稱之為“惰性模式”辑奈。
e.
后續(xù)使用過(guò)程再補(bǔ)充

5 babel

Babel 把用最新標(biāo)準(zhǔn)編寫的 JavaScript 代碼向下編譯成可以在今天隨處可用的版本苛茂。 這一過(guò)程叫做“源碼到源碼”編譯已烤, 也被稱為轉(zhuǎn)換編譯。
npm install --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react babel-preset-stage-0
a. babel文件配置
新建babel配置文件.babelrc妓羊,內(nèi)容為

{
   "presets": [
     "es2015",
     "react",
     "stage-0"
   ],
   "plugins": []
 }

b.詳細(xì)介紹
①babel-core 轉(zhuǎn)碼
如果你需要以編程的方式來(lái)使用 Babel胯究,可以使用 babel-core 這個(gè)包。babel-core 的作用是把 js 代碼分析成 ast 躁绸,方便各個(gè)插件分析語(yǔ)法進(jìn)行相應(yīng)的處理裕循。有些新語(yǔ)法在低版本 js 中是不存在的,如箭頭函數(shù)净刮,rest 參數(shù)剥哑,函數(shù)默認(rèn)值等,這種語(yǔ)言層面的不兼容只能通過(guò)將代碼轉(zhuǎn)為 ast淹父,分析其語(yǔ)法后再轉(zhuǎn)為低版本 js星持。
首先安裝 babel-core
②babel-loader
允許用babel或webpack編譯JavaScript文件。
需要在webpack的配置文件中的添加babel-loader:

{
      test: /\.js$/,
      exclude: /(node_modules|bower_components)/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env']
        }
      }
}

③ babel-preset-es2015 用于解析 ES6

④ babel-preset-react 用于解析 JSX

⑤ babel-preset-stage-0 用于解析 ES7 提案
檢測(cè):將index.js文件使用箭頭函數(shù)編寫

var fun = str => {
    document.getElementById('app').innerHTML = str;
}
fun('Babel設(shè)置成功')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弹灭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子揪垄,更是在濱河造成了極大的恐慌穷吮,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饥努,死亡現(xiàn)場(chǎng)離奇詭異捡鱼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)酷愧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門驾诈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人溶浴,你說(shuō)我怎么就攤上這事乍迄。” “怎么了士败?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵闯两,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我谅将,道長(zhǎng)漾狼,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任饥臂,我火速辦了婚禮逊躁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘隅熙。我一直安慰自己稽煤,他們只是感情好核芽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著念脯,像睡著了一般狞洋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绿店,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天吉懊,我揣著相機(jī)與錄音,去河邊找鬼假勿。 笑死借嗽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的转培。 我是一名探鬼主播恶导,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼浸须!你這毒婦竟也來(lái)了惨寿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤删窒,失蹤者是張志新(化名)和其女友劉穎裂垦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肌索,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蕉拢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诚亚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晕换。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖站宗,靈堂內(nèi)的尸體忽然破棺而出闸准,到底是詐尸還是另有隱情,我是刑警寧澤梢灭,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布恕汇,位于F島的核電站,受9級(jí)特大地震影響或辖,放射性物質(zhì)發(fā)生泄漏瘾英。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一颂暇、第九天 我趴在偏房一處隱蔽的房頂上張望缺谴。 院中可真熱鬧,春花似錦、人聲如沸湿蛔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阳啥。三九已至添谊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間察迟,已是汗流浹背斩狱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扎瓶,地道東北人所踊。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像概荷,于是被迫代替她去往敵國(guó)和親秕岛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • 無(wú)意中看到zhangwnag大佬分享的webpack教程感覺(jué)受益匪淺误证,特此分享以備自己日后查看继薛,也希望更多的人看到...
    小小字符閱讀 8,164評(píng)論 7 35
  • 版權(quán)聲明:本文為博主原創(chuàng)文章改鲫,未經(jīng)博主允許不得轉(zhuǎn)載。 webpack介紹和使用 一林束、webpack介紹 1像棘、由來(lái) ...
    it筱竹閱讀 11,121評(píng)論 0 21
  • webpack 介紹 webpack 是什么 為什么引入新的打包工具 webpack 核心思想 webpack 安...
    yxsGert閱讀 6,464評(píng)論 2 71
  • 寫在開(kāi)頭 先說(shuō)說(shuō)為什么要寫這篇文章, 最初的原因是組里的小朋友們看了webpack文檔后, 表情都是這樣的: (摘...
    Lefter閱讀 5,286評(píng)論 4 31
  • 本系列導(dǎo)航:劍指offer(第二版)java實(shí)現(xiàn)導(dǎo)航帖 面試題8:二叉樹(shù)的下一個(gè)節(jié)點(diǎn) 題目要求:給定二叉樹(shù)和其中一...
    ryderchan閱讀 1,890評(píng)論 2 0