摘要:安裝必要的開(kāi)發(fā)包安裝兩個(gè)包安裝編寫一個(gè)的首先我們編寫一個(gè)的組件但是這僅僅是一個(gè)組件,我們需要一個(gè)頁(yè)面來(lái)容納的組件。到這一步,需要準(zhǔn)備的東西已經(jīng)完成了。
2.1 采用create react app 編寫
create-react-app項(xiàng)目 [[點(diǎn)擊前往Github]](https://github.com/facebook/c... 是facebook推出的入門初始化項(xiàng)目,適合新手第一次使用,無(wú)需進(jìn)行各種配置,完美的實(shí)現(xiàn)了開(kāi)箱即用理念。
2.1.1 建立項(xiàng)目npx create-react-app my-app cd my-app npm start
npx命令是npm在5.x版本之后推出的一個(gè)增強(qiáng)功能,它幫助開(kāi)發(fā)者可以臨時(shí)下載項(xiàng)目進(jìn)行執(zhí)行之后,會(huì)自動(dòng)刪除這個(gè)臨時(shí)下載的項(xiàng)目。不會(huì)在全局項(xiàng)目中生成文件。
上面的命令,表示,下載create-react-app項(xiàng)目,并且運(yùn)行這個(gè)項(xiàng)目,在my-app目錄中創(chuàng)建新項(xiàng)目。
2.1.2 運(yùn)行項(xiàng)目創(chuàng)建完成之后,進(jìn)入 my-app 目錄。執(zhí)行npm語(yǔ)句,進(jìn)行本地開(kāi)發(fā)預(yù)覽。
我們進(jìn)入這個(gè)創(chuàng)建好的文件夾my-app,執(zhí)行npm run start即可進(jìn)入本地開(kāi)發(fā)預(yù)覽了。
如圖所示,我們已經(jīng)在本地端口3000上運(yùn)行了這個(gè)程序??齑蜷_(kāi)你的瀏覽器查看一下吧。
2.2 手動(dòng)配置webpack編寫這個(gè)章節(jié)有點(diǎn)超綱,有興趣的同學(xué)可以仔細(xì)閱讀一下。這一節(jié)是針對(duì)有興趣深入了解的同學(xué)的,如果你現(xiàn)在一下子還是無(wú)法理解這些知識(shí),建議后面再來(lái)回顧。
2.2.1 建立項(xiàng)目我們首先創(chuàng)建一個(gè)webpack-app文件夾。然后使用VS Code打開(kāi)這個(gè)目錄。
使用Ctrl+~鍵打開(kāi)控制臺(tái),如果無(wú)法打開(kāi)說(shuō)明熱鍵已經(jīng)被占用了。點(diǎn)擊菜單的 查看 -> 終端。
第一步先輸入npm init 建立前端項(xiàng)目的配置文件。
直接一路回車到結(jié)束。
2.2.2 安裝必要的開(kāi)發(fā)包安裝react,react-dom兩個(gè)包
npm install --save-dev react react-dom
安裝webpack
npm install --save-dev webpack-cli webpack webpack-dev-server2.2.3 編寫一個(gè)react的hello world
首先我們編寫一個(gè)HelloWorld的React組件
import React, { PureComponent } from "react" export default class index extends PureComponent { render() { return (Hello world React!) } }
但是這僅僅是一個(gè)組件,我們需要一個(gè)HTML頁(yè)面來(lái)容納React的組件。
Helloworld React
到這一步,React需要準(zhǔn)備的東西已經(jīng)完成了。
我們需要來(lái)編寫webpack對(duì)這個(gè)項(xiàng)目進(jìn)行打包,而webpack對(duì)開(kāi)發(fā)提供的DevServer的支持,讓我們來(lái)看一看,到底怎么做的。
我們?cè)陧?xiàng)目根目錄中創(chuàng)建一個(gè)名為"webpack.config.js"的文件。
const path = require("path") module.exports = { mode:"development", entry: "./src/index.js", context: __dirname, target: "web", devServer: { proxy: {}, contentBase: path.join(__dirname, "public"), historyApiFallback: true, hot: true, noInfo: true, port: 3000 } }
配置完webpack.config.js文件之后,我們將在packageInfo.json中的scripts節(jié)點(diǎn)加入一個(gè)新的命令。
"scripts": { "test": "echo "Error: no test specified" && exit 1", "dev": "webpack-dev-server" },
我們?cè)诮K端運(yùn)行npm run dev之后,你將會(huì)在控制臺(tái)中看到如下內(nèi)容。
webpack編譯之后告訴我們,它無(wú)法識(shí)別JSX格式。這個(gè)問(wèn)題就延伸出了,我們?cè)撊绾螌?duì)現(xiàn)代化的前端進(jìn)行配置。
現(xiàn)在對(duì)于前端代碼的轉(zhuǎn)換,通常采用的是babel轉(zhuǎn)譯。我們來(lái)看看編譯react需要哪些插件。點(diǎn)此查看babel如何配置webpack
首先,我們需要安裝babel,在終端輸入npm install --save-dev babel-loader @babel/core @babel/preset-env @babel/preset-react
我們修改webpack.config.js文件,讓他看起來(lái)像這樣
const path = require("path") const HtmlWebpackPlugin = require("html-webpack-plugin"); module.exports = { mode: "development", entry: "./src/entry.js", context: __dirname, target: "web", devServer: { proxy: {}, contentBase: path.join(__dirname, "public"), port: 3000 }, module: { rules: [{ test: /.js$/, exclude: /node_modules/, loader: "babel-loader" }] }, plugins: [ new HtmlWebpackPlugin( Object.assign({}, { inject: true, template: __dirname + "/public/index.html", }) ), ] }
在根目錄創(chuàng)建.bablerc文件,這個(gè)文件是用于配置babel編譯的,在文件中輸入以下內(nèi)容。
{ "presets": ["@babel/preset-env","@babel/preset-react"] }
不知道你是否注意到了,我修改了entry入口文件。因?yàn)閮H僅一個(gè)React組件并無(wú)法正常運(yùn)行,我們需要告知React框架,我們將組件注入在哪個(gè)DOM下,這個(gè)文件可以配置全局的Store、路由、全局的設(shè)定等。我們?cè)?b>src目錄下創(chuàng)建entry.js,下面是entry.js文件的源碼。
import React from "react"; import ReactDOM from "react-dom"; import Index from "./index"; ReactDOM.render(, document.querySelector("#app"));
代碼非常的簡(jiǎn)單,就是調(diào)用ReactDOM將React組件渲染到了id為app的節(jié)點(diǎn)下。
OK,現(xiàn)在我們?cè)俅芜\(yùn)行npm run dev,你將會(huì)看到webpack編譯成功的提示,我們現(xiàn)在打開(kāi)瀏覽器,輸入http://localhost:3000,你將會(huì)看到運(yùn)行編譯成功的網(wǎng)頁(yè)。
2.2.4 webpack加入HMR支持(熱更新)大家有沒(méi)有發(fā)現(xiàn),我們現(xiàn)在這個(gè)項(xiàng)目修改了之后,是需要刷新整個(gè)頁(yè)面的。并沒(méi)有那種很高端很大氣的動(dòng)態(tài)刷新?
現(xiàn)在我們就將熱更新加入我們的項(xiàng)目中。
我們將webpack.config.js文件做如下修改
const path = require("path") const HtmlWebpackPlugin = require("html-webpack-plugin"); const webpack = require("webpack") module.exports = { mode: "development", entry: [ "webpack/hot/dev-server", "./src/entry.js" ], output: { filename: "[name].bundle.js", path: path.resolve(__dirname, "dist") }, context: __dirname, target: "web", devServer: { proxy: {}, contentBase: path.join(__dirname, "public"), hot: true, port: 3000 }, module: { rules: [{ test: /.js$/, exclude: /node_modules/, loader: "babel-loader" }] }, plugins: [ new HtmlWebpackPlugin( Object.assign({}, { inject: true, template: __dirname + "/public/index.html", }) ), new webpack.NamedModulesPlugin(), new webpack.HotModuleReplacementPlugin() ] }
注意到了么,我們新增了NamedModulesPlugin和HotModuleReplacementPlugin兩個(gè)插件。還在devServer節(jié)點(diǎn)中加入了hot:true,并且追加了output節(jié)點(diǎn)。
然后,我們將entry.js文件修改為這樣:
import React from "react"; import ReactDOM from "react-dom"; import Index from "./index"; ReactDOM.render( < Index / > , document.querySelector("#app")); if (module.hot) { module.hot.accept() }
我們?cè)俅问褂?b>npm run dev運(yùn)行項(xiàng)目,然后修改index.js文件中的字符串,你會(huì)發(fā)現(xiàn),現(xiàn)在是無(wú)刷新更新頁(yè)面內(nèi)容了。
2.2.5 webpack優(yōu)化打包速度我們?cè)?b>package.json的scripts節(jié)點(diǎn)中加入一條新語(yǔ)句"webpack":"webpack",然后來(lái)看一看現(xiàn)在項(xiàng)目默認(rèn)的打包速度是多少時(shí)間。
耗時(shí):2211ms
我們修改webpack.config.js文件中的babel配置項(xiàng)
module: { rules: [{ test: /.js$/, exclude: /node_modules/, loader: "babel-loader?cacheDirectory=true" }] },
在babel-loader后面加入了cacheDirectory=true,再次執(zhí)行編譯,第一次你會(huì)發(fā)現(xiàn)速度并沒(méi)有優(yōu)化,這是因?yàn)檫€沒(méi)有建立緩存文件,但是第二次速度就提升了20%。
耗時(shí):1644ms (-500ms)
其他的包括抽取公共組件,加入hash等等策略我們以后再細(xì)聊。
源碼下載地址:https://github.com/yodfz/learn-webpack-react-config
原文地址:https://www.yodfz.com/detail/...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100885.html
摘要:而主要被設(shè)計(jì)用于維持組件內(nèi)部私有狀態(tài)。初始化初始化需要在中進(jìn)行。對(duì)于的定義為請(qǐng)求修改某個(gè)數(shù)據(jù),而的實(shí)現(xiàn)則是將對(duì)變量的修改放入一個(gè)修改隊(duì)列中,在一個(gè)循環(huán)之后進(jìn)行批量更新結(jié)果深入點(diǎn)涉及的更新機(jī)制。推出了與版本之后推出來(lái)的就是為了解決這些問(wèn)題的。 3.1 什么是state 我們要認(rèn)識(shí)到,React中的組件其實(shí)是一個(gè)函數(shù),所以state是函數(shù)內(nèi)部的私有變量,外部其他組件或者方法都是無(wú)法直接訪問(wèn)...
摘要:代表基本上是常規(guī)。第次更新,在年完成。幾乎完全支持所有主要的瀏覽器。但這將是一段時(shí)間,直到較舊版本的瀏覽器逐步停止使用。這意味著將轉(zhuǎn)換為。在組件的情況下,寫入的將如下所示在我們?cè)诘谝粋€(gè)作出反應(yīng)組件使用的語(yǔ)法是語(yǔ)法。 本文轉(zhuǎn)載自:眾成翻譯譯者:iOSDevLog鏈接:http://www.zcfy.cc/article/3797原文:https://www.fullstackreact....
摘要:本文轉(zhuǎn)載自眾成翻譯譯者鏈接原文今天,我們從一開(kāi)始就開(kāi)始。讓我們看看是什么,是什么讓運(yùn)轉(zhuǎn)起來(lái)。什么是是一個(gè)用于構(gòu)建用戶界面的庫(kù)。它是應(yīng)用程序的視圖層。所有應(yīng)用程序的核心是組件。組件是可組合的。虛擬完全存在于內(nèi)存中,并且是網(wǎng)絡(luò)瀏覽器的的表示。 本文轉(zhuǎn)載自:眾成翻譯譯者:iOSDevLog鏈接:http://www.zcfy.cc/article/3765原文:https://www.ful...
摘要:組件關(guān)注的只應(yīng)該是狀態(tài),不同的狀態(tài)呈現(xiàn)不同的表現(xiàn)形式。組件一切都是組件倡導(dǎo)開(kāi)發(fā)者將切分成一個(gè)個(gè)組件從而達(dá)到松耦合及重用的目的。只不過(guò)的命名是進(jìn)入狀態(tài)之前跟進(jìn)入狀態(tài)之后。 前端已不止于前端-ReactJs初體驗(yàn) 原文寫于 2015-04-15 https://github.com/kuitos/kuitos.github.io/issues/21 要說(shuō)2015年前端屆最備受矚目的技術(shù)是啥...
閱讀 3918·2021-09-27 13:36
閱讀 4666·2021-09-22 15:12
閱讀 3107·2021-09-13 10:29
閱讀 1868·2021-09-10 10:50
閱讀 2409·2021-09-03 10:43
閱讀 551·2019-08-29 17:10
閱讀 472·2019-08-26 13:52
閱讀 3308·2019-08-23 14:37