摘要:建立項目首先,創建工程目錄現在我們已經創建了我們要開發應用程序的文件夾,接著需要添加一個文件。這里為了版本的一致性,我把里的版本號前面刪除了。為此,需要創建一個名為的文件,用來配置。
想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你!
在過去的一年和一些人中,我一直在與 Creative Tim 合作。 我一直在使用 create-react-app 來開發一些不錯的產品。 有很多客戶詢問如何在 Webpack 上遷移我們的產品模板。
在多次要求求之后,我們寫了這個關于如何開始使用 React with Webpack 4和 Babel 7 的小教程。在本教程的最后,將向大家展示如何在新創建的應用程序上添加 Material Dashboard React。
在我們開始之前,請確保你的電腦上安裝了 npm 和 Nodejs 的最新版本。在撰寫本文時,我的電腦上的最新版本是 npm 的 6.4.1 和 Nodejs 的 8.12.0 (lts)。
建立項目首先,創建工程目錄:
mkdir react-webpack-babel-tutorial cd react-webpack-babel-tutorial
現在我們已經創建了我們要開發應用程序的文件夾,接著需要添加一個 package.json 文件。 有兩種創建方式,你可以選擇其中的一種:
1.只需創建 package.json 文件,無需任何其他配置:
npm init -y
如下所示,package.json 文件已創建,其中包含一些非常基本的信息。
2.使用一些額外的配置設置創建 package.json 文件
npm init
我在我們新創建的 package.json 文件中添加了一些東西,比如一些很好的 keywords,一個repo等等...
之后,在根目錄下創建 src 文件夾,然后在 src 下分別創建 index.html 和 index.js.
1.Linux / MacOS 命令
mkdir src touch src/index.html touch src/index.js
2.Windows 命令
mkdir src echo "" > srcindex.html echo "" > srcindex.js
創建完后在 index.html 添加以下內容。
React Tutorial
接著在 index.js 中添加一些內容,目前只是為了展示一些內容,下面繼續完善。
(function () { console.log("hey mister"); }());
此時,目錄結構如下:
將 Webpack 添加到項目中安裝 Webapck 及所需的開發環境依賴模塊。
npm install --save-dev webpack webpack-cli webpack-dev-server
webpack
用來配置我們的新應用
本文所用的版本是 4.19.0
webpack-cli
可以在命令行中使用 Webpack 了
本文所用的版本是 3.1.0
webpack-dev-server
這樣,當我們對新應用程序中的文件進行更改時,就不需要刷新頁面了。每當我們在應用程序中更改文件時,它會自動刷新瀏覽器頁面
本文所用的版本是 3.1.8
看一下package.json文件,將看到這三個包被添加到這個文件中,如下所示:
"devDependencies": { "webpack": "^4.19.0", "webpack-cli": "^3.1.0", "webpack-dev-server": "^3.1.8" }
補充說明一下版本號前的 ^,~ 的區別
指定版本:比如"webpack": "4.19.0",表示安裝 4.19.0 的版本
波浪號 ~ 指定版本:比如 "webpack-cl": "~3.1.0",表示安裝 3.1.0 的最新版本(不低于1.1.0),但是不安裝 1.2.x,也就是說安裝時不改變大版本號和次要版本號
^ 指定版本:比如 "webpack-dev-server": "^3.1.8",,表示安裝 請輸入代碼3.1.4 及以上的版本,但是不安裝4.0.0,也就是說安裝時不改變大版本號。
package.json 文件只能鎖定大版本,也就是版本號的第一位,并不能鎖定后面的小版本,你每次 npm install 都是拉取的該大版本下的最新的版本,為了穩定性考慮我們幾乎是不敢隨意升級依賴包的,這將導致多出來很多工作量,測試/適配等,所以 package-lock.json 文件出來了,當你每次安裝一個依賴的時候就鎖定在你安裝的這個版本。
所以當我們 npm install 安裝完插件后,都會生成兩個文件一個是 node_modules 和 package-lock.json 。
這里為了版本的一致性,我把 package.json 里的 版本號前面 ^ 刪除了。
接著新建 Webpack 配置文件 webpack.config.js:
1.Linux/MacOS 命令
touch webpack.config.js
2.Windows 命令
echo "" > webpack.config.js
如果你不想使用命令行,也可以簡單地手動創建文件。
在開始處理 Webpack 配置文件之前,先在應用程序中安裝一些我們需要的東西。
首先安裝 path 作為開發環境的路徑依賴。
npm install --save-dev path
此外,由于不想在 HTML 中手動注入 index.js 文件,因此需要安裝 html-webpack-plugin 的插件。 此插件通過配置在 HTML 文件中注入 index.js,無需手動操作。
npm install --save-dev html-webpack-plugin
再次,我將 package.json 文件刪除所有 ^。
安裝完后在 package.json 文件中的 scripts 屬性里添加以為內容:
"webpack": "webpack", "start": "webpack-dev-server --open"
現在 package.json 內容如下:
{ "name": "react-webpack-babel-tutorial", "version": "1.0.0", "description": "This is a Tutorial to showcase the usage of React with Webpack and Babel", "main": "index.js", "scripts": { "test": "echo "Error: no test specified" && exit 1", "webpack": "webpack", "start": "webpack-dev-server --open" }, "repository": { "type": "git", "url": "git+https://github.com/creativetimofficial/react-webpack-babel-tutorial.git" }, "keywords": [ "react", "webpack", "babel", "creative-tim", "material-design" ], "author": "Creative Tim(https://www.creative-tim.com/)", "license": "MIT", "bugs": { "url": "https://github.com/creativetimofficial/react-webpack-babel-tutorial/issues" }, "homepage": "https://github.com/creativetimofficial/react-webpack-babel-tutorial#readme", "devDependencies": { "html-webpack-plugin": "3.2.0", "path": "0.12.7", "webpack": "4.19.0", "webpack-cli": "3.1.0", "webpack-dev-server": "3.1.8" } }
接著運行以下命令,看看會發生什么:
npm run webpack
Webpack 將自動獲取 src/index.js 文件,編譯它,并將其輸出到 dist/main.js 中,并壓縮代碼。這是因為我們還沒有配置 Webpack 配置文件。此外,由于我們還沒有配置該文件,我控制臺中將出現一些警告。
如果我們運行如下命令:
npm start
webpack-dev-server 將自動啟動服務器并使用該服務器打開默認瀏覽器。但是,由于我們沒有配置webpack.config.js 文件,所以頁面展示并不是我們想要的內容。
如果想停止服務,只需在命令行中同時按下 CTRL + C 鍵。
接著在 webpack.config.js 添加以下內容:
const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); module.exports = { entry: path.join(__dirname,"src","index.js"), output: { path: path.join(__dirname,"build"), filename: "index.bundle.js" }, mode: process.env.NODE_ENV || "development", resolve: { modules: [path.resolve(__dirname, "src"), "node_modules"] }, devServer: { contentBase: path.join(__dirname,"src") }, plugins: [ new HtmlWebpackPlugin({ template: path.join(__dirname,"src","index.html") }) ] };1.entry
entry 可以是個字符串或數組或者是對象。 當 entry 是個字符串的時候,用來定義入口文件:
entry: "./js/main.js"
當 entry 是個數組的時候,里面同樣包含入口js文件,另外一個參數可以是用來配置webpack提供的一個靜態資源服務器,webpack-dev-server。webpack-dev-server 會監控項目中每一個文件的變化,實時的進行構建,并且自動刷新頁面:
entry: [ "webpack/hot/only-dev-server", "./js/app.js" ]
當 entry 是個對象的時候,我們可以將不同的文件構建成不同的文件,按需使用,比如在我的 hello 頁面中只要 引入 hello.js 即可:
entry: { hello: "./js/hello.js", form: "./js/form.js" }2.output
output 參數是個對象,用于定義構建后的文件的輸出。其中包含 path 和 filename:
output: { path: "./build", filename: "bundle.js" }3.mode
這是輸出的模式,這里將其 mode 設置為 “development”。如果在腳本中指定 NODE_ENV 變量,那么它將使用這個變量。請參閱下面關于如何使用 NODE_ENV 的示例(請注意,本教程中的 package.json 文件中不會進行以下更改,這只是一個示例,可以看到它是如何工作的)
"webpack": "NODE_ENV=production webpack",4.resolve
webpack 在構建包的時候會按目錄的進行文件的查找,resolve 屬性中的 extensions 數組中用于配置程序可以自行補全哪些文件后綴:
resolve:{ extensions:["",".js",".json"] }5.devServer
這告訴 webpack-dev-server 需要提供哪些文件。 這里是 src 文件夾中的所有內容都需要在瀏覽器中瀏覽。
6.plugins在這里,我們設置了我們的應用程序中需要的插件。到目前為止,只需要 html-webpack-plugin,它告訴服務器 index.bundl.js 應該被注入到 index.html 文件中
再次運行以下命令,顯示會跟上一次不同:
npm run webpack
webpack-dev-server 從 src 文件夾中讀取所有內容并輸出到我們的瀏覽器中。
配置 React,Babel 與 styles loaders通過運行以下命令來引入 React :
npm i react react-dom --save-dev
在我們的開發過程中,如果我們在 JS 文件中添加React代碼,Webpack 會給我們一個錯誤,它不知道如何在bundle.js 文件中編譯 React。
修改 index.js 內容如下:
import React from "react"; import ReactDOM from "react-dom"; let HelloWorld = () => { returnHello there World!
} ReactDOM.render(, document.getElementById("root") );
再次運行以下命令:
npm start
錯誤如下:
所以這就是 Babel 出現的原因, Babel 將告訴 Webpack 如何編譯 React 代碼。
安裝 Babel 相關依賴:
npm install --save-dev @babel/core @babel/node @babel/preset-env @babel/preset-react babel-loader@babel/core
這是將ES6及以上版本編譯成ES5
@babel/nodebabel-node 是 babel-cli 的一部分,它不需要多帶帶安裝。
它的作用是在 node 環境中,直接運行 es2015 的代碼,而不需要額外進行轉碼。例如我們有一個 js 文件以 es2015 的語法進行編寫(如使用了箭頭函數)。我們可以直接使用 babel-node es2015.js 進行執行,而不用再進行轉碼了。
可以說:babel-node = babel-polyfill + babel-register
@babel/preset-react這個是把 React 代碼編譯成 ES5 代碼。
babel-loader和 babel-cli 一樣,babel-loader 也會讀取 .babelrc 或者 package.json 中的 babel 段作為自己的配置,之后的內核處理也是相同。唯一比 babel-cli 復雜的是,它需要和 webpack 交互,因此需要在 webpack 這邊進行配置。比較常見的如下:
module: { rules: [ { test: /.js$/, exclude: /(node_modules|bower_components)/, loader: "babel-loader" } ] }
如果想在這里傳入 babel 的配置項,也可以把改成:
// loader: "babel-loader" 改成如下: use: { loader: "babel-loader", options: { // 配置項在這里 } }
我們需要為項目中添加一些樣式,此時就需要使用樣式相關的加載器,這邊使用 scss,安裝命令如下:
npm install --save-dev style-loader css-loader sass-loader node-sassstyle-loader
通過注入 標簽將 CSS 添加到 DOM 中
css-loadercss-loader用于將 css 文件打包到js中, 常常配合 style-loader 一起使用,將 css 文件打包并插入到頁面中
sass-loader加載 SASS/SCSS 文件
node-sass將 SCSS 文件編譯為 CSS 文件
在 src 下創建 scss 文件:
1.Linux/MacOS 命令
touch src/index.scss
2.window 命令
echo "" > src/index.scss
并添加以下內容:
body { div#root{ background-color: #222; color: #8EE4AF; } }
接著導入 index.js 中
import React from "react"; import ReactDOM from "react-dom"; // this line is new // we now have some nice styles on our react app import "index.scss"; let HelloWorld = () => { returnHello there World!
} ReactDOM.render(, document.getElementById("root") );
記得刪除 package.json 中的 ^ 號,內容如下:
{ "name": "react-webpack-babel-tutorial", "version": "1.0.0", "description": "This is a Tutorial to showcase the usage of React with Webpack and Babel", "main": "index.js", "scripts": { "test": "echo "Error: no test specified" && exit 1", "webpack": "webpack", "start": "webpack-dev-server --open" }, "repository": { "type": "git", "url": "git+https://github.com/creativetimofficial/react-webpack-babel-tutorial.git" }, "keywords": [ "react", "webpack", "babel", "creative-tim", "material-design" ], "author": "Creative Tim(https://www.creative-tim.com/)", "license": "MIT", "bugs": { "url": "https://github.com/creativetimofficial/react-webpack-babel-tutorial/issues" }, "homepage": "https://github.com/creativetimofficial/react-webpack-babel-tutorial#readme", "devDependencies": { "@babel/core": "7.0.1", "@babel/node": "7.0.0", "@babel/preset-env": "7.0.0", "@babel/preset-react": "7.0.0", "babel-loader": "8.0.2", "css-loader": "1.0.0", "html-webpack-plugin": "3.2.0", "node-sass": "4.9.3", "path": "0.12.7", "sass-loader": "7.1.0", "style-loa der": "0.23.0", "webpack": "4.19.0", "webpack-cli": "3.1.0", "webpack-dev-server": "3.1.8" }, "dependencies": { "react": "16.5.1", "react-dom": "16.5.1" } }
如果我們再次運行上述任何命令,錯誤仍將存在。 我們還沒有告訴 Webpack 它應該使用 Babel 和樣式加載器來編譯我們的 React 和 SCSS 代碼。
接下來要做的是為 Babel 添加配置文件。 為此,需要創建一個名為 .babelrc 的文件,用來配置 Babel。
可以直接在 webpack.config.js 文件中添加 Babel 的配置。 為此,你可以查看官方的 babel-loader 文檔。 就我而言,我認為最好將 Babel 配置放在自己的文件中,這樣就不會使 Webpack 配置過于復雜難讀。
在根目錄下創建 .babelrc
1.Linux/MacOS 命令
touch .babelrc
2.Windows 命令
echo "" > .babelrc
并在 .babelrc 中添加以下代碼,這樣 babel-loader 就會知道用什么來編譯代碼:
{ "presets": [ "@babel/env", "@babel/react" ] }
完成這些步驟后,我們需要在項目中添加一些內容,以便我們可以導入各種文件,如圖像。 還需要添加一個插件,讓我們可以使用類等等。 讓我們在類中添加類屬性,基本上,它將讓我們能夠使用 面向對象編程 方式來編寫代碼。
因此,讓我們將 webpack.config.js 更改為以下內容(我也添加了一些注釋,可能會對你有所幫助):
// old // const path = require("path"); // const HtmlWebpackPlugin = require("html-webpack-plugin"); // new import path from "path"; import HtmlWebpackPlugin from "html-webpack-plugin"; module.exports = { entry: path.join(__dirname,"src","index.js"), output: { path: path.join(__dirname,"build"), filename: "index.bundle.js" }, mode: process.env.NODE_ENV || "development", resolve: { modules: [path.resolve(__dirname, "src"), "node_modules"] }, devServer: { contentBase: path.join(__dirname,"src") }, module: { rules: [ { // 這樣我們就可以將React、ES6及以上的任何內容編譯成正常的ES5語法 test: /.(js|jsx)$/, // 不希望編譯node_modules中的任何內容 exclude: /node_modules/, use: ["babel-loader"] }, { test: /.(css|scss)$/, use: [ "style-loader", // creates style nodes from JS strings "css-loader", // translates CSS into CommonJS "sass-loader" // compiles Sass to CSS, using Node Sass by default ] }, { test: /.(jpg|jpeg|png|gif|mp3|svg)$/, loaders: ["file-loader"] } ] }, plugins: [ new HtmlWebpackPlugin({ template: path.join(__dirname,"src","index.html") }) ] };
我們需要對 package.json 文件做一個更改。我們需要告訴我們的腳本在 Webpack 的配置文件中,使用 import 而不是 require 語句。 否則它會給我們一個錯誤,它不知道import 表示什么。
{ "name": "react-webpack-babel-tutorial", "version": "1.0.0", "description": "This is a Tutorial to showcase the usage of React with Webpack and Babel", "main": "index.js", "scripts": { "test": "echo "Error: no test specified" && exit 1", "webpack": "babel-node ./node_modules/webpack/bin/webpack", "start": "babel-node ./node_modules/webpack-dev-server/bin/webpack-dev-server --open" }, "repository": { "type": "git", "url": "git+https://github.com/creativetimofficial/react-webpack-babel-tutorial.git" }, "keywords": [ "react", "webpack", "babel", "creative-tim", "material-design" ], "author": "Creative Tim(https://www.creative-tim.com/)", "license": "MIT", "bugs": { "url": "https://github.com/creativetimofficial/react-webpack-babel-tutorial/issues" }, "homepage": "https://github.com/creativetimofficial/react-webpack-babel-tutorial#readme", "devDependencies": { "@babel/core": "7.0.1", "@babel/node": "7.0.0", "@babel/plugin-proposal-class-properties": "7.0.0", "@babel/preset-env": "7.0.0", "@babel/preset-react": "7.0.0", "babel-loader": "8.0.2", "css-loader": "1.0.0", "file-loader": "2.0.0", "html-webpack-plugin": "3.2.0", "node-sass": "4.9.3", "path": "0.12.7", "sass-loader": "7.1.0", "style-loader": "0.23.0", "webpack": "4.19.0", "webpack-cli": "3.1.0", "webpack-dev-server": "3.1.8" }, "dependencies": { "react": "16.5.1", "react-dom": "16.5.1" } }
我們還需要在 .babelrc 文件中添加 @babel/plugin-proposal-class 屬性,Babel將會知道如何處理類屬性。
{ "presets": [ "@babel/env", "@babel/react" ], "plugins": [ "@babel/plugin-proposal-class-properties" ] }
現在總算配置完成了。再次運行上述任何一個命令,就可以順利跑起來啦。
npm run webpack
npm start使用 Webpack 和 Babel 項目將 Material Design 加到我們的新 React 項目中
正如在這篇文章的開頭講的,我們不會講 Material Design 樣式如何寫,這需要大量的工作。
相反,這里添加一個很好的產品來實現 Google 的 Material Design,其中包括Creative Tim 員工的一些小改動。 我們將向其添加 Material Dashboard React。
首先從 github 上把項目拷貝下來:
git clone https://github.com/creativetimofficial/material-dashboard-react.git
Download from Github
好的,現在我們有兩個項目 - Material Dashboard React 和 我們剛創建的項目。
現在,我們不能簡單地將 src 文件夾從 Material Dashboard React 復制到我們的新項目中。 這會給我們帶來很多錯誤, 如缺少依賴關系的錯誤,找不到模塊等。
因此,我建議首先將 Material Dashboard React 的 package.json 中的依賴項添加到 package.json 中。 我們不需要 Material Dashboard React 包中的所有依賴項,因為我們使用 Webpack 構建了自己的服務器。 除了產品本身,我們還添加了其他樣式加載器。
所以說,我們需要如下:
npm install --save @material-ui/core@3.1.0 @material-ui/icons@3.0.1 @types/googlemaps@3.30.11 @types/markerclustererplus@2.1.33 chartist@0.10.1 classnames@2.2.6 perfect-scrollbar@1.4.0 react-chartist@0.13.1 react-google-maps@9.4.5 react-router-dom@4.3.1 react-swipeable-views@0.12.15
我們不會全部都講,你可以在 npmjs.com 上找到它們的詳細信息和它們自己的文檔。
再一次,進入 package.json 文件并從我們剛剛安裝的安裝包中刪除(^)。
接著拷貝 Material Dashboard React src 下的所有文件到我們項目 src 下
好了,差不多做完了,我們拷貝 Material Dashboard React 下的 src文件中所有內容到我們項目 src 下,并覆蓋 index.js 文件。但是要保留 index.html 文件。
拷貝前
拷貝后
現在需要在 index.html 中添加一些樣式和字體,如下:
React Tutorial
還有一個小問題。 當我們刷新頁面時,有一個錯誤 Cannot GET/dashboard。 如果我們跳轉到另一個頁面,會得到如, Cannot GET /user錯誤等 。 所以根本上,我們的路由不起作用,需要在 src/index.js 或 webpack.config.js 中進行一些更改。
這里選擇使用第一個方案,因為它非常簡單易懂。
我們在新導航方式在 index.js 更改 history,使用 createHashHistory() 替換 createBrowserHistory()。
這將允許我們刷新頁面而不會出現任何其他錯誤,現在我們完成了。
import React from "react"; import ReactDOM from "react-dom"; import { createHashHistory } from "history"; import { Router, Route, Switch } from "react-router-dom"; import "assets/css/material-dashboard-react.css?v=1.5.0"; import indexRoutes from "routes/index.jsx"; const hist = createHashHistory(); ReactDOM.render(, document.getElementById("root") ); {indexRoutes.map((prop, key) => { return ; })}
原文:
https://medium.freecodecamp.o...
你的點贊是我持續分享好東西的動力,歡迎點贊!
歡迎加入前端大家庭,里面會經常分享一些技術資源。文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101812.html
摘要:配置方式找到文件如需添加路由則在里面添加,同時需要后端更改配置除了上面的路徑,其他路徑全部指向單頁應用多路由預渲染指南使用說明源碼為方便快速構建項目,本例所有配置的代碼均放在項目中。 寫在前面 每次構建react項目的時候都會配置一大堆東西,時間久了就會忘記怎么配置。為了方便自己記憶也為了其他開發者在構建react應用時能夠快速開發,故作此記錄。 本項目基于 create-react-...
摘要:原文地址原文作者譯者校對者和其他人有一些關于比較好的博文,跟隨這些博文,我最近開始使用。今天,我將展示如何從零開始建立一個工程,以及如何使用管理構建過程。我也將陳述關于的第一印象,尤其是使用和。 原文地址:Getting started with TypeScript and React 原文作者:Jack_Franklin 譯者:luxj 校對者:veizz Tom Dale...
摘要:優化代碼拆分從入口文件開始,遞歸地構建了整個應用的模塊依賴圖表,然后通常會將所有的模塊打包成一個。 如果你還不知道什么是React,請點擊這里github源碼 安裝Node.js 如果你還不知道什么是ECMAScript,請點擊這里 如果你還不知道什么是Node.js,請點擊這里 下載Node.js并安裝;接著打開windows命令行窗口分別輸入node -v及npm -v如下圖所示,...
摘要:構建構建就是把源代碼轉換成發布到線上的可執行代碼,包括如下內容。自動刷新監聽本地源代碼的變化,自動重新構建刷新瀏覽器。自動發布更新完代碼后,自動構建出線上發布代碼并傳輸給發布系統。將文件放入到項目中,在中新建一個放字體圖標的文件夾。 項目地址 github.com/wudiufo/Web… 知識點概覽: Loader,HMR ,Create React App, Caching, Plug...
閱讀 3125·2021-11-15 18:14
閱讀 1779·2021-09-22 10:51
閱讀 3290·2021-09-09 09:34
閱讀 3508·2021-09-06 15:02
閱讀 1024·2021-09-01 11:40
閱讀 3193·2019-08-30 13:58
閱讀 2529·2019-08-30 11:04
閱讀 1086·2019-08-28 18:31