#ReactApp項目構(gòu)建流程【1】

小白的ReactApp項目構(gòu)建流程【環(huán)境搭建與HelloWorld】

  • 開發(fā)環(huán)境:win10
  • 開發(fā)軟件:webstorm

創(chuàng)建新項目(空文件夾)

  • 當(dāng)前目錄下(以后以home表示)執(zhí)行cmd

        webstorm上直接alt+F12即可彈出控制臺
    
  • $npm init

        項目初始化削解,文件夾下新增package.json文件
    
    
  • $npm i webpack

    安裝webpack
           
    
  • $npm i react

    安裝react
    
    
  • $npm i react-dom -S

    其中 
    -S就是--save的簡寫,就行npm默認(rèn)一個start的字段,你可以不必輸入npm run start 而只需輸入npm start寸爆,這兩個效果是一樣的供常。
    -D就是--save-dev 這樣安裝的包的名稱及版本號就會存在package.json的devDependencies這個里面筷屡,
    而--save會將包的名稱及版本號放在dependencies里面饲化。
            
    
  • home下豪直,新建build文件夾雇逞,同時內(nèi)建webpack.config.js

    放置配置文件荤懂,webpack的config文件,以及一些腳本文件
    
            
    
  • home下塘砸,新建client文件夾节仿,同時內(nèi)建app.js以及App.jsx

    放置客戶端文件,app.js作為應(yīng)用入口掉蔬,App.jsx用于聲明整個應(yīng)用頁面上的內(nèi)容   
    
    
  • 修改webpack.config.js以及package.json,給app.js添加測試代碼

    [package.json]  
    ->start
    {
      "name": "react-learn",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
            "build":"webpack --config build/webpack.config.js"  
            //scripts-build:
             指定webpack的config文件廊宪,實際執(zhí)行時需要刪除此代碼,否則會報錯
             package.json mustbe actual JSON, not just JavaScript.因為json不識別注釋
      },
      "author": "zc",
      "license": "ISC",
      "dependencies": {
        "react": "^16.2.0",
        "webpack": "^3.10.0"
      }
    }
    ->End
    
    
    [webpack.config.json] 
    ->start
    const path = require('path');
    module.exports = {
        entry: {                                     //資源文件的路徑女轿,打包時的入口
            app: path.join(__dirname,'../client/app.js')
        },
        output: {                                    //輸出的目錄
            filename: "[name].[hash].js",            //[]代表變量,hash用于刷新緩存
            path: path.join(__dirname,'../dist'),    //輸出文件存放的路徑
            publicPath: '/public'                    //靜態(tài)資源文件引用的路徑的前綴              --/public/app.hash.js,用于區(qū)分靜態(tài)資源/API請求,還可以直接修改為cdn路徑
        }
    }
    -> End
    
    [app.js]
    ->start
    alert(123);
    ->end
    
    
    
  • $npm run build

    打包完成箭启,文件結(jié)構(gòu)內(nèi)出現(xiàn)dist目錄并且生成項目文件
    
    
  • 編寫App.jsx

    import  React from 'react'
      
    export default class App extends React.Component{
        render(){
            return(
                <div>Hello World </div>
            )
        }
    }
    //tips:
    1:如果未出現(xiàn)智能提示,
    Settings->Languages&Frameworks->Node.js and NPM->Coding Assistance->Enable 即可
    2:jsx內(nèi)快速書寫html標(biāo)簽:tab鍵
    
    
  • $npm i react-dom -S

    用于將react組件渲染到dom中
    
    
    
  • 修改app.js,用于將react組件渲染到dom中

    import ReactDOM from 'react-dom'
    import App from './App.jsx'
    ReactDOM.render(App,document.body)  
        //將App掛載在document.body中蛉迹,因為此時并沒有模板傅寡,只有body可以使用,官方推薦在body中創(chuàng)建一個默認(rèn) 節(jié)點作為主dom
    
    
  • 修改webpack.config.js

    與output同級添加webpack解析模塊
    
    module: {                           //添加模塊婿禽,讓webpack識別jsx代碼(非標(biāo)準(zhǔn)js語法)
        rules: [
            {
                test:/.jsx$/,           //正則表達(dá)式赏僧,react項目設(shè)置為所有的符合test正則的文件
                loader: 'babel-loader'  //識別符合test正則的文件的loader,babel是編譯各種最新js語法的工具扭倾,react指定工具
            }
        ]
    }
    
    
  • $npm i babel-loader -D

    開發(fā)的工具使用 -D加載提供給開發(fā)者的develope版本模塊
    
    
  • $npm i babel-core-D

     babel-loader只是webpack的插件淀零,其核心還是babel-core,需要安裝
     
    
  • $npm run build

     此時運行會報錯誤膛壹,因為babel默認(rèn)直接編譯es6語法而不能支持jsx,需要配置babel編譯模式->
     
    
  • root目錄下新建.babelrc文件并編輯

    {
     "presets": [  //代表babel支持的語法,因為語法太多驾中,所以babel-core中并未包含es2015
             ["es2015",{"loose":true}],//松散類型唉堪,非嚴(yán)格類型
             "react"                   //babel只編譯有react選項的代碼
         ]
     }
     
    
  • $npm i babel-preset-es2015 babel-preset-es2015-loose babel-preset-react -D

  • 刪除老dist目錄后 ->npm run build

    新生成的dist目錄中的[name].[hash].js文件會非常大,因為react源碼會被編譯其中肩民,
    其中最底下的代碼就是開發(fā)者自己編寫的代碼
    
    
  • $npm i html-webpack-plugin -D

    想要在瀏覽器中打開自己編譯好的軟件唠亚,需要安裝此插件
    
    本人安裝成了 webpack-html-plugin 233
    
    
  • 引用html-webpack-plugin【最簡單的引用方式】

    在webpack.config.js頂部添加代碼
    
    const HTMLPlugin=require('html-webpack-plugin')
    
    同時添加與module同級的選項
    
    plugins:[
        new HTMLPlugin();//webpack編譯時生成HTML頁面,并且把所有的entry選項都注入到HTML頁面中持痰,
                            并且filename,path和publicPath都是基于output選項進(jìn)行拼接而成
    ]
    
    
  • $npm run build

    可以看到在dist目錄中出現(xiàn)webpack編譯成的HTML頁面
    
    因為此時并未起服務(wù)器/路徑映射,因此此時路徑將會出現(xiàn)問題,無法訪問資源文件
    
    刪除dist目錄,將webpack.config.js->output->publicPath置為空,使webpack使用絕對路徑編譯文件
    
    重新 build,用HTML進(jìn)入編譯好的HTML文件
    
    會發(fā)現(xiàn)仍然沒有內(nèi)容,F12發(fā)現(xiàn)報錯
       --報錯1:不能直接將react組件掛載在document.body上,但這并不是影響運行的錯誤
       --報錯2:ReactDOM.render時,也需要用jsx語法編寫
    
        其實,jsx文件使用的js語法是es6的語法,而在app.js中含有jsx代碼,也就是說app.js代碼中實際使用的是
    ES6+jsx代碼,之前只是對jsx用babel編譯成ES2015代碼,而ES6文件并未做此處理,因此需要webpack.config.
    js->rules修改test,用于將ES6語法編譯成ES2015,將現(xiàn)有的test /.jsx$/ -> /.(jsx|js)$/后,再執(zhí)行
    [npm run build],此時會報錯,原因是在[root -> node_modules]下的文件在npm init加載時已經(jīng)經(jīng)過編譯,
    所以此文件夾下的js代碼需要過濾,那么在rules中新添加test用于[過濾非node_modules]文件夾下的js文件
    
    
    
  • 修改webpack.config.js->npm run build

     {
           test:/.js$/,
           loader: 'babel-loader',
           exclude:[
                path.join(__dirname,'../node_modules')
              ]
      }
      
    
  • 打開HTML,報錯,顯示React未定義

    貼上錯誤代碼
    _reactDom2.default.render(React.createElement(_App2.default, null), document.body);
    
    在app.js中,引入了jsx標(biāo)簽,必須要引入React,因為jsx代碼最終翻譯出來的標(biāo)簽都會用到React
    
    
  • app.js中引入React

    import React require('react')
    
    
  • $npm run build

    進(jìn)入HTML,OJBK,順利顯示Hello World
    
    

小結(jié):

后續(xù)再寫

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灶搜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子工窍,更是在濱河造成了極大的恐慌割卖,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件患雏,死亡現(xiàn)場離奇詭異鹏溯,居然都是意外死亡,警方通過查閱死者的電腦和手機淹仑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門丙挽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匀借,你說我怎么就攤上這事颜阐。” “怎么了怀吻?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵瞬浓,是天一觀的道長。 經(jīng)常有香客問我蓬坡,道長,這世上最難降的妖魔是什么磅叛? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任屑咳,我火速辦了婚禮,結(jié)果婚禮上弊琴,老公的妹妹穿的比我還像新娘兆龙。我一直安慰自己,他們只是感情好敲董,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布紫皇。 她就那樣靜靜地躺著,像睡著了一般腋寨。 火紅的嫁衣襯著肌膚如雪聪铺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天萄窜,我揣著相機與錄音铃剔,去河邊找鬼撒桨。 笑死,一個胖子當(dāng)著我的面吹牛键兜,可吹牛的內(nèi)容都是我干的凤类。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼普气,長吁一口氣:“原來是場噩夢啊……” “哼谜疤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起现诀,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤夷磕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赶盔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體企锌,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年于未,在試婚紗的時候發(fā)現(xiàn)自己被綠了撕攒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡烘浦,死狀恐怖抖坪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闷叉,我是刑警寧澤擦俐,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站握侧,受9級特大地震影響蚯瞧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜品擎,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一埋合、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧萄传,春花似錦甚颂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至衍菱,卻和暖如春赶么,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梦碗。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工禽绪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蓖救,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓印屁,卻偏偏與公主長得像循捺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子雄人,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

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