亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

使用 Webpack 和 ES6 進行 React 開發

2024-04-27 15:14:01
字體:
來源:轉載
供稿:網友

使用 Webpack 和 ES6 進行 React 開發

時間 2016-06-22 06:30:49  黃騰飛的個人網站原文  http://huangtengfei.com/2016/05/13/develop-with-react-and-webpack-and-es6/主題 Webpack React ECMAScript

工欲善其事必先利其器,在進行 React 的開發時,通常會結合 Webpack 和 ES6 一起進行。本文講的正是如何使用 React + Webpack + ES6 進行組合開發。關于 React 的入門,后面另開一文。

本文最終的輸出是一個 Hello World 。

本文所涉及的代碼在 這里 ,可以直接作為一個種子項目使用:

git clone https://github.com/huangtengfei/react-webpack-es6.gitcd react-webpack-es6npm installnpm run dev

如果你使用 sublime 開發,可以安裝 sublime-react 插件。

安裝依賴項

在項目目錄下 ,初始化一個 package.json 文件,執行:

npm init

安裝 react 和 react-dom 依賴:

npm install react react-dom --save

安裝 webpack 和 webpack-dev-server 依賴:

npm install webpack webpack-dev-server --save-dev 

安裝 babel 依賴:

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

代碼編寫

本文示例最終的目錄結構是這樣的:

--your project  |--components(組件目錄)    |--Hello(組件1)      |--imgs        |--bg.png      |--index.jsx      |--index.less    |--World(組件2)      |--index.jsx      |--index.less    |--index.js(入口文件)  |--build(輸出目錄)    |--index.html    |--bundle.js(輸出文件,由 webpack 打包后生成的)  |--package.json  |--webpack.config.js

創建 React 組件

按照前面的目錄結構,新建一個 components 文件夾,存放所有組件。

在 components 下建一個 Hello 文件夾,用來存放 Hello 組件的邏輯和樣式。

Hello/index.js 的代碼如下:

import React from 'react';import ReactDOM from 'react-dom';class Hello extends React.Component {	render() {		return <h1>Hello</h1>	}}ReactDOM.render(<Hello />, document.getElementById('hello'));

World 組件的開發同上,略去。

創建頁面

在 build 目錄下創建一個 HTML 頁面,來使用前面創建的兩個組件。

index.html 的代碼如下:

<!DOCTYPE html><html>  <head>    <meta charset="UTF-8">    <title>Hello World</title>  </head>  <body>    <div id="hello"></div>    <div id="world"></div>  </body></html>

使用 Webpack 打包

Webpack 是一個前端模塊加載兼打包工具,可以對 JS、CSS 和 圖片 等都作為模塊來使用和處理。對不同類型的需要編譯的文件,需要使用相應的加載器(比如用 babel 轉譯 ES6)。

另外,由于 Webpack 需要一個入口文件來進行分析和處理,需要先將 React 組件引入到一個主文件。

從前文的目錄結構可以看出, components/index.js 就是這個主文件,它的代碼如下:

import Hello from './Hello/index.jsx';import World from './World/index.jsx';

下面就是 Webpack 配置文件 webpack.config.js 的編寫,代碼如下:

var path = require('path');var webpack = require('webpack');var ROOT_PATH = path.resolve(__dirname);var APP_PATH = path.resolve(__dirname, './components/index.js');var BUILD_PATH = path.resolve(__dirname, './build');module.exports = {	entry: APP_PATH,	output: {		path: BUILD_PATH,		filename: 'bundle.js'	},	module: {		loaders: [{			test: //.jsx?$/,			loaders: ['babel-loader?presets[]=es2015,presets[]=react']		}]	}}

最后,需要將編譯打包后的文件 bundle.js 引入到 index.html 中:

<body>  ...  <script src="./bundle.js"></script></body>

構建和啟動

構建

前面的開發完成后,需要執行 webpack.config.js 中的構建任務,生成 bundle.js ,這個操作可以在 package.json 中配置:

"scripts": {  "build": "webpack"}

執行 npm run build 完成構建,此時打開 index.html ,即可看到效果。

啟動服務器

但這種方式顯得略 low,一是它是雙擊以文件的形式打開 HTML 頁面,二是每次有更改都要手動執行 npm run build 重新打包。

一種更好的方式是啟動一個靜態資源服務器,監聽文件內容修改并自動打包。在這里用的是前面安裝好的 webpack-dev-server ,在 package.json 中配置:

"scripts": {  "dev": "webpack-dev-server --devtool eval --progress --colors --hot --content-base build"}

簡單解釋一下 dev 中各個參數的含義: webpack-dev-server 在 localhost:8080 建立一個 Web 服務器; --devtool eval 映射編譯好的源碼,用于調試; --progress 顯示代碼打包進度; --colors 表示在命令行中顯示顏色; --content-base 來指定 server 啟動后的內容目錄。

執行 npm run dev 啟動 server,此時打開 http://localhost:8080 ,即可看到效果。修改一下 Hello 或者 World 組件中的內容,刷新頁面,你會發現瀏覽器中內容也相應改變了。

自動刷新

前面實現了對文件修改的監聽和自動打包,但瀏覽器還需要手動刷新。其實可以在 Webpack 的配置文件中增加一個入口點,實現自動刷新。

···    entry: [		'webpack/hot/dev-server',    	'webpack-dev-server/client?http://localhost:8080',    	APP_PATH	],···

這樣,應用在修改后,瀏覽器就會自動刷新了。

更完整的種子

其實講到這里本文已經可以結束了,不過為了讓種子更完整,并體現 Webpack 的強大,再加上點樣式和圖片吧。

處理樣式

不管什么類型的資源,Webpack 都需要相應的 loader 來處理。對于普通的 css,需要 css-loader 和 style-loader 兩種 loader,前者會遍歷所有 css 并對 url() 處理,后者將樣式插入到頁面的 style 標簽中。對于預編譯 css 語言,還需要額外的 loader,比如 less-loader 或 sass-loader ,這里用 less 舉例。

首先,安裝 loader :

npm install less-loader css-loader style-loader --save-dev

然后,在 webpack.config.js 中配置 loader,注意 loader 的處理順序是從右到左的:

...{    test: //.less$/,    loader: 'style!css!less'}...

配置完之后要重新運行一下 npm run dev

接著,在 Hello 和 World 組件中各添加一個樣式文件,這里用 Hello/index.less 舉例:

@lightgrey: #ccc;h1 {  background: @lightgrey;}

最后,在 components/index.js 中引入 less 文件:

import './Hello/index.less';import './World/index.less';

切換到瀏覽器,看一下是不是有變化了呢~

處理圖片

為了減輕網絡請求的壓力,有時候會有將小圖片轉成 BASE64 字符串的需求,這個可以通過 url-loader 來實現。

同處理樣式中的操作,首先安裝 url-loader :

npm install url-loader --save-dev

然后配置 webpack.config.js :

...{    test: //.(png|jpg)$/,    loader: 'url?limit=50000'}...

重新重新運行一下 npm run dev

接著,在 Hello 組件下建一個 imgs 文件夾,并放入一張小于 50K 的 bg.png 做背景圖片,然后修改 Hello/index.less 文件:

h1 {  background: url('./img/bg.png');}

切換到瀏覽器,審查元素,看一下圖片是不是轉成 BASE64 字符串了呢~

到此為止,這已經是一個較為完整的種子了。想對 React 、Webpack 和 ES6 各自做深入了解的,請自行查閱資料~

補充

loader 的寫法

在使用 Webpack 打包小節 webpack.config.js 的編寫中, babel-loader 最初我是這樣寫的:

loaders: [{    test: //.jsx?$/,    loader: 'babel-loader',    query: {        presets: ['es2015', 'react']    }}]

后來為了使用熱加載,引入了 react-hot ,loader 要改為 loaders,即:

...    loaders: ['babel-loader', 'babel-loader'],    query: {        presets: ['es2015', 'react']    }...

這時在執行構建的時候,會報錯 Error: Cannot define ‘query’ and multiple loaders in loaders list ,于是改成這種寫法。不過后來直接用 webpack-dev-server 的 --hot 選項,也沒引入 react-hot 了,但此處寫法仍保留,便于后面擴展 loader 。

安裝 less-loader 報錯

如果在安裝樣式的幾個 loader 的時候,報以下錯誤:

UNMET PEER DEPENDENCY less@^2.3.1

不妨試試用 cnpm 單獨安裝 less :

tnpm i less@^2.3.1
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美亚洲成人网| 最近2019免费中文字幕视频三| 欧美激情精品久久久久久大尺度| 亚洲人成电影网站色www| 中文字幕亚洲一区二区三区| 精品丝袜一区二区三区| 欧美电影免费看| 日韩成人在线视频| 亚洲国产精品嫩草影院久久| 97视频在线观看播放| 91情侣偷在线精品国产| 精品人伦一区二区三区蜜桃免费| 亚洲精品在线91| 亚州av一区二区| 91精品国产乱码久久久久久蜜臀| 欧美专区第一页| 亚洲天堂日韩电影| 91情侣偷在线精品国产| 超碰日本道色综合久久综合| 最近2019中文字幕大全第二页| 亚洲高清免费观看高清完整版| 成人免费直播live| 欧美最猛性xxxxx免费| 少妇高潮久久久久久潘金莲| 亚洲欧美成人一区二区在线电影| 国产欧美中文字幕| 亚洲天堂视频在线观看| 欧美性极品xxxx娇小| 国产精品久久一| 中文字幕久热精品在线视频| 精品久久久久久久久国产字幕| 成人免费在线网址| 久久影院资源网| 亚洲精品一区中文字幕乱码| 久久久免费观看视频| 欧美日韩免费观看中文| 久久中文字幕国产| 亚洲丝袜一区在线| 日韩中文在线观看| 日韩一区二区久久久| 亚洲精品美女视频| 欧美电影免费在线观看| 亚洲成人在线视频播放| 97超级碰碰人国产在线观看| 1769国内精品视频在线播放| 亚洲欧美日韩中文在线制服| 在线成人激情黄色| 亚洲免费视频一区二区| 欧美一区视频在线| 亚洲人成网站999久久久综合| 亚洲影视九九影院在线观看| 欧美激情精品久久久久久免费印度| 欧美视频在线免费看| 亚洲精品大尺度| 久久夜精品va视频免费观看| 亚洲网在线观看| 欧美亚洲成人网| 亚洲美女中文字幕| 国产日韩欧美在线观看| 黑人巨大精品欧美一区二区免费| 亚洲一二三在线| 日本久久精品视频| 久久精品中文字幕电影| 欧美激情精品久久久久久变态| 日韩成人久久久| 欧美日韩999| 日本一区二区在线播放| 精品久久久久久久久久| 91久久久久久久一区二区| 色999日韩欧美国产| 欧美极品欧美精品欧美视频| 国产精品亚洲一区二区三区| 成人免费视频在线观看超级碰| 精品国产乱码久久久久久天美| 亚洲人成网站777色婷婷| 欧美午夜激情视频| 日韩在线中文视频| 成人免费观看a| 国产精品99导航| 国产成人极品视频| 色爱精品视频一区| 91免费在线视频网站| 日韩欧美有码在线| 国产在线视频不卡| 日韩网站免费观看| 日韩欧美主播在线| 亚洲精品一区二区在线| 欧美日韩精品在线| 91av免费观看91av精品在线| 国精产品一区一区三区有限在线| 91精品久久久久久综合乱菊| 国模精品视频一区二区三区| 色婷婷av一区二区三区在线观看| 国产女同一区二区| 日本精品一区二区三区在线| 日韩美女中文字幕| 91国产视频在线播放| 亚洲激情电影中文字幕| 国产精品专区第二| 日韩网站免费观看高清| 欧美极度另类性三渗透| 国内精品免费午夜毛片| 中文字幕日韩在线视频| 日韩大片免费观看视频播放| 国产精品一区二区三区免费视频| 91香蕉电影院| 久久99国产精品久久久久久久久| 国产成人福利网站| 亚洲最大成人网色| 亚洲第一综合天堂另类专| 国产一区玩具在线观看| 亚洲自拍偷拍色图| 青青草原一区二区| 日韩美女视频中文字幕| 91成人精品网站| 亚洲国产毛片完整版| 欧美高清视频在线| 亚洲精品一区中文| 国产精品人人做人人爽| 亚洲free性xxxx护士hd| 国产成人精品午夜| 欧美日韩成人网| 欧美激情一二三| 欧美色播在线播放| 欧美性高跟鞋xxxxhd| 日韩成人激情视频| 国产精品美女呻吟| 欧美激情一区二区三区久久久| 午夜精品久久久久久久99热浪潮| 狠狠色香婷婷久久亚洲精品| 亚洲成人亚洲激情| 日韩电影中文字幕一区| 中文字幕精品影院| 国内精品久久久久久久久| 在线播放日韩精品| 亚洲欧洲日产国码av系列天堂| 欧洲日韩成人av| 成人h片在线播放免费网站| 国产专区欧美专区| 亲爱的老师9免费观看全集电视剧| 亚洲美腿欧美激情另类| 91av在线免费观看| 亚洲视频在线观看视频| 亚洲天堂免费视频| 亚洲成人xxx| 欧美日韩在线另类| 色老头一区二区三区| 成人黄色片网站| 国产精品www网站| 欧美一区二区三区免费观看| 国外日韩电影在线观看| 精品国偷自产在线| 九九热视频这里只有精品| 欧美孕妇孕交黑巨大网站| 影音先锋欧美精品| 欧美成人激情在线| 国产剧情久久久久久| 日本精品久久中文字幕佐佐木| 日韩电影中文字幕在线观看| 日本精品性网站在线观看| 亚洲国产成人精品一区二区| 国产69精品久久久久9| 高清一区二区三区四区五区| 国产精自产拍久久久久久蜜|