標籤:

手動創建react+babel+webpack開發環境

從年前到現在一直在找工作,也由於家裡的一些事情耽擱。所以,擱置已久的日誌,是時候重新拾起記錄了。由於之前在項目中盡量用的腳手架,甚至有些小項目根本就沒有搭建什麼框架。於是,今天琢磨了一下全手動搭建react+webpack+babel開發環境。一方面填坑,另一方面藉此機會熟悉一下這些工具的API。以下正文:

一、npm初始化

npm init

npm是時下相對流行的包管理器,使用此命令創建package.json文件,這個文件包含了項目中所有包的版本信息、依賴關係等。

二、安裝webpack

npm install webpack -g

安裝完成後,在項目根目錄創建一個webpack.config.js用於配置webpack。一定要全局安裝。

1.entry

用於配置項目入口文件

2.output

用於配置打包後文件的去向。其中,filename表示打包後的js叫什麼名字,path表示打包後的文件所在的目錄。如:path=__dirname+"/dist",filename="bundle.js"表示執行package打包後,在項目根目錄下會新建一個dist文件夾,其中包含一個bundle.js文件,這個文件就是打包後的js。

3.devServer

npm install –save-dev webpack-dev-server

用於配置webpack伺服器。這部分配置比較關鍵,這是webpack提供的熱更新功能,即時修改,即時出效果。其中比較主要的幾個配置有:

conentBase。伺服器啟動後訪問的根目錄,比如:contentBase:"./dist"表示伺服器開啟後訪問的是當前項目下的dist目錄。

inline。其值為布爾值,如果設置為true,表示開啟熱更新功能。否則不開啟。

port。用於設置服務埠,默認是8080。

historyApiFallback。布爾值,這個屬性設置在spa項目開發中非常有用,如果設置為true,所有的跳轉將指向index.html

注意:

1.webpack-dev-server指令用於啟動webpack伺服器,如果在後面加上--content-base表示伺服器啟動後訪問devServer配置中contentBase指定的目錄。如果為預設值,表示訪問當前項目的根目錄。

2.「__dirname」是node.js中的一個全局變數,它指向當前執行腳本所在的目錄。

4.loaders配置

loaders配置寫在module模塊下。通過使用不同的loader,webpack通過調用外部的腳本或工具可以對各種各樣的格式的文件進行處理,比如說分析JSON文件並把它轉換為JavaScript文件,或者說把下一代的JS文件(ES6,ES7)轉換為現代瀏覽器可以識別的JS文件。或者說對React的開發而言,合適的Loaders可以把React的JSX文件轉換為JS文件。其中主要的配置屬性有:

test。一個匹配loaders所處理的文件的拓展名的正則表達式(必須)。如:test:"/.jsx$/"表示匹配所有的jsx語法,還有json、js、img、css、less、scss等文件格式匹配。

loader。指定loader名稱。如: babel、json、babel-loader、css-loader、style-loader等。

include/exclude。手動指定包含/不包含的文件或文件夾。如:node_modules中的文件一般是不需要我們用loader進行轉換的,可以手動排隊這個文件夾下的所有文件。使用exclude:/node_modules/

query。一些額外的配置。

三、babel安裝和配置

npm install –save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react

babel-core是babel的核心庫,babel-loader是jsx的loader,babel-preset-es2015是es6的轉換器,babel-preset-react是react的語法轉換器。

配置babel有兩種方式:

1.在webpack的loader里配置

在loader里加上query:{presets:[『es2015』,』react』]}

2.配置.babelrc文件

新建.babelrc文件,按照如下配置即可。

{ "presets": ["es2015","react"]}

四、配置完成。開始工程

npm install –save react react-dom

1.安裝好react和react-dom開發包,就可以進行開發工作了。我的項目目錄如下圖所示:

2.在src下新建main.js文件,其中的代碼也很簡單,就是用react在頁面輸出一個hello world(這貌似是業界接觸新技術的必寫經典案例,哈哈。)

import React from "react"import ReactDOM from "react-dom"ReactDOM.render( <h1>hello,worlddddd</h1>, document.getElementById("root"))

3.在項目根目錄新建index.html,其內容非常簡單,僅僅是在body里添加一個id為root的div。然後引入外部js,這裡js的路徑要注意了,因為我們要導入的是打包好的js文件,所以,script的src值應該是./dist/bundle.js,否則頁面不能引用到main.js里的內容。

4.執行webpack進行打包

5.執行webpack-dev-server –content-base。可以看到hello world正常顯示出來了。此時個性main.js里的內容,頁面上會實時更新。

五、寫在後面

當我執行webpack後,發現在打包的dist目錄下,並沒有找到我的index.html文件,按道理來說,html文件不是應該隨著打包一起進去的嗎,否則我在發布的時候沒有html怎麼行。後來百度才發現,漏掉了最重要的一個東西:HtmlWebpackPlugin。這個插件的作用是依據一個簡單的模板,幫你生成最終的Html5文件,這個文件中自動引用了你打包後的JS文件。每次編譯都在文件名中插入一個不同的哈希值。也就是說,有了這個配置,在html中根本不需要我們手動引入js文件,打包的時候html會根據配置自動引入。

1.安裝

npm install –save-dev html-webpack-plugin

2.配置

在webpack配置文件中頂部加入:var HtmlWebpackPlugin = require(html-webpack-plugin)。在plugins里進行如下配置:

plugins:[ new HtmlWebpackPlugin({ title:"react demo", filename:"index.html", template:"index.html", inject:true })]

title:表示html中title的值

filename:輸出的 HTML 文件名,默認是 index.html, 也可以直接配置帶有子目錄。

template: 模板文件路徑,支持載入器,比如 html!./index.html

inject: true | 『head』 | 『body』 | false ,注入所有的資源到特定的 template 或templateContent 中,如果設置為 true 或者 body,所有的 javascript 資源將被放置到 body 元素的底部,』head』 將放置到 head 元素中。

3.去掉html中的script引用,執行webpack

執行了webpack後,你會發現dist目錄下多了個index.html,打開發現在body部分自動引入了bundle.js。

六、總結

本文總結了手動搭建react開發環境的步驟及部分注意點,儘管都是些基本配置,但不得不注意這個過程中多數的坑,只有經歷了才知道。可能我的總結不盡完整,後續開發過程中配置肯定會越來越複雜,坑也會有的,先就這些吧。未完待續……


推薦閱讀:

如何看待知乎使用 React 重構?
React+Redux打造「NEWS EARLY」單頁應用 一步步讓你理解最前沿技術棧的真諦
掌握這5大核心概念,你就理解了React
有沒有考慮過ReactDom.render的第一個參數到底是什麼?

TAG:React |