react編譯
『壹』 webpack怎麼自動編譯reactjs
使用webpack編譯打包react是非常便捷的。這也是人們常用的一種方式。但是在使用過程中,一定要注意一個細節,那就是webpack和babel-loader的安裝位置。
react安裝
當然,使用react必須先安裝react和react-dom,其安裝方式很簡單(前提是我們必須安裝有npm)。
# npm install react react-dom –save
react安裝就這樣簡單,其實react和react-dom就是相當於js類庫。但是我們需要解析器來解析react的語法。
react解析器babel安裝
babel安裝的位置是我們這篇文章的目的。babel有兩種安裝的位置:一種是全局安裝,一種是本地安裝——也就是安裝在項目目錄下的node_moles下。
# npm install babel-core babel-loader babel-preset-react –save-dev
//本地安裝
#npm install babel-core babel-loader babel-preset-react –g
//全局安裝
一般情況下我們選擇本地安裝,這樣便於管理。
打包工具webpack的安裝
同樣,webpack的安裝位置也是這篇文章描述的所要注意的點。當然,它也有兩種安裝的位置:全局安裝和本地安裝。
# npm install webpack –save-dev
//本地安裝
# npm install webpack –g
//全局安裝
如果選擇本地安裝,那麼在使用的時候較麻煩一些,我們需要在命令前加上路徑。所以一般情況下都是全局安裝,這樣就可以在任意位置直接使用。
這里我們選擇全局安裝。這樣才能出現我們將要說的問題。
webpack配置文件編寫
安裝完webpack以後,下面來編寫webpack配置文件webpack.config.js。這里我不寫全部,只寫載入loader部分。
代碼一
mole:{
loaders: [
{
test: /\.js$/,
loader: 'babel',
query:{
presets:['react']
}
}
]
}
編譯過程中出現的錯誤
好了,到了關鍵的地方了。現在我們整個系統的配置是這樣的:babel安裝到本地,webpack安裝到全局位置,webpack配置文件如代碼一所示。
接下來我們就要編譯打包我們的項目。
# webpack
執行該命令以後,你會發現出現如下的錯誤:
ERROR in (webpack)/~/node-libs-browser/~/process/browser.js
Mole build failed: Error: Couldn't find preset "react" relative to
directory
"/node/lib/node_moles/webpack/node_moles/node-libs-browser/node_moles/process"
……
這也就是說找不到babel-preset-react。
好了,說了這么多終於在這里引出了我們將要討論的問題(這里大家不要嫌我啰嗦,為什麼出現這種問題,其原因總要弄清楚。什麼樣的配置會出現這種問題,了解以後才容易上手解決)。
解決問題的方式
出現上述問題以後,我們有這樣三種方式可以解決。
方式一
要解決這個問題很簡單。我們知道,出現這個問題是因為bable和webpack安裝的位置不同,所以找不到babel-preset-react。因為在配置文件中有這樣一段代碼。
query:{
presets:['react']
}
好了,既然知道是安裝位置不同,那我們可以將babel安裝在全局位置,這樣這個問題不就解決了嗎。
#npm remove babel-core babel-loader babel-preset-react –save-dev
//首先移除原先安裝的babel
#npm install babel-core babel-loader babel-preset-react –g
//全局安裝
沒錯,問題解決了。但是我們不推薦使用這種方式。因為這樣不便於管理,所以還是使用其他的方式。
方式二
此種方式和方式一大同小異。方式一是改變babel的安裝位置,而這里是改變webpack的安裝位置。原先webpack是安裝到全局位置的,所以找不到安裝到本地項目目錄下的babel-preset-react。因此我們可以改變webpack的位置。
# npm remove webpack –g
//移除原先的webpack
# npm install webpack –save-dev
//將webpack安裝到本地位置——也就是項目目錄下的node_moles中
# ln –s /項目根目錄/node_moles/webpack/bin/webpack.js /usr/bin/webpack
//為了使用webpack方便,在這里我們在/usr/bin目錄下建立軟連接(也就是快捷方式)
//這樣我們就可以在任意位置直接使用webpack命令了。
此時我們已經改變了webpack的安裝位置。現在二者同在項目目錄下安裝。所以可以正確編譯了。
此種方式較方式一,我個人比較推薦這種方式,這樣比較方便管理。但是,這種方式也不是沒有弊端。如果我們有多個項目,那我們就需要在每個項目下都安裝webpack,那豈不是很麻煩。所以這種方式也不是很好。
方式三
該方式應該說是最值得推薦的,因為不需要改變webpack和babel的安裝位置。webpack還是在全局位置,babel還是在本地項目位置下。我們需要做的就是修改webpack的配置文件,在代碼一的基礎上添加一句代碼。
代碼二
mole:{
loaders: [
{
test: /\.js$/,
loader: 'babel',
exclude:/node_moles/,
query:{
presets:['react']
}
}
]
}
『貳』 react native 每次編譯都需要重啟么
本著什麼都要攙和的原則,一起來看看React Native是如何開發iOS APP。
圍觀本文需自備Mac OSX , XCode , node 以及 npm 。
做好准備之後,打開你的終端(或其他命令行利器),鍵入下面命令:
npm install -g react-native-cli
和
react-native init AwesomeProject
此時,我們會看到一個名為AwesomeProject的文件夾,這就是工程文件的位置。使用XCode打開AwesomeProject.xcodeproj,並點擊RUN,會看到iOS模擬器以及此項目對應的內容,效果如下:
如果想要修改顯示內容,請打開index.ios.js,裡面是一堆Javascript模樣的東西。修改之後,在iOS模擬器中cmd+R就可以看到修改後的效果。
接下來,我們按照教程,來展示一張電影海報,為了方便,我們直接修改index.ios.js。
一、模擬數據
『叄』 react+webpack的熱編譯問題
devServer沒有配 loaders里的react-hot也沒配 看下官方文檔去吧
『肆』 如何使用 ES6 編寫一個 React 模塊,並且編譯後發布到 NPM
前言
如果你在使用 React, 那麼肯定已經擼了好多自己的組件, 並嘗試著共享出來。在 OneAPM 前端開發過程中, 我們也曾遇到了一些組件共享的問題:
例如:
是通過 git 直接發布還是通過 NPM 發布 ?
發布的是 ES5 的代碼還是 ES6 的代碼 ?
如何解決 Babel5 和 Babel6 的沖突 ?
這篇文章會通過編寫一個叫做 MyComponet 的例子來演示發布一個模塊需要注意的地方, 並不涉及單元測試和代碼規范等。
前端開發果真是發展迅猛,剛享受到由模塊化,組件化和單元測試帶來的種種好處,又得迅速擁抱 Grunt, Gulp, Browserify, Webpack 這類自動化工具的變革。除了工具和生態圈,JavaScript 本身也在飛速發展著。ES2015(ES6) ,ES2016(ES7) ... 照這樣的節奏,幾乎是一年一個標准。標准多了,為解決兼容性的問題,竟也派生出了 源代碼 和 編譯 的概念。前端開發者通過語法糖、轉化器、Polyfill 等,可以享受到標准乃至尚未定稿草案里的規范的便利,大幅提升開發效率。
至於這個模塊本身,它的功能特別簡單, 就是顯示模塊自身的的屬性。
源代碼
我們來編寫組件 MyComponent.jsx ,放到項目的 src 目錄下。
import React from 'react';
const MyComponent = props=> {
return <div>
props:
<pre>{JSON.stringify(props, null, 2)}</pre>
</div>
}
export default MyComponent;
關於各種文件放在哪裡, 這里是我推薦的一些約定:
src 下用於存放源代碼
lib 是編譯後的代碼,這個目錄只讀
所有包含 ES6 語法的文件名統一後綴為 .es6
所有包含 JSX 語法的文件後統一綴名為 .jsx
假設源代碼里還有另外兩個文件 foo.es6 和 bar.js,簡化起見都丟到 src 的根目錄下。
編譯
為了把 ES6 代碼編譯成 ES5,需要安裝 Babel,這個工具可以說野心極大,一次編譯可以讓 JavaScript 運行在所有地方。(聽起來是不是有點 Java 的作風)
目前最常用的是 Babel5 版本,但是 Babel6 版本的設計更為精巧,已經非常推薦更新。也正是由於 Babel 有兩個版本,所以開發過程中很有可能遇到這樣的情況,
模塊 A 的開發依賴於 Babel5 版本,而模塊 B 依賴於 Babel6 版本。
解決這個問題最好的做法就是把 A 和 B 拆開,獨立開發和發布。並且在發布到 NPM 的時候發布是的編譯後的,也就是 ES5 版本的代碼。
所以如果你的機器上的 babel 是全局安裝的,是時候卸載它了,因為它的版本不是 5 就是 6 ,會導致一些不可預見的問題。
npm uninstall babel-cli --global
正確的安裝方式是把 babel-cli 作為 develeopment 的依賴
npm install babel-cli --save-dev
使用的時候並不是直接調用全局的 Babel 而是調用依賴里的 Babel 可執行文件
./node_moles/.bin/babel
如果按照前文的約定來組織代碼,src 目錄結構看起來是這樣的
src
├── bar.js
├── foo.es6
└── MyComponent.jsx
模塊所有的代碼都在一個目錄下,這樣編譯過程就簡單多了,兩條命令就可以完成
./node_moles/.bin/rimraf lib
./node_moles/.bin/babel src ---files --source-maps --extensions .es6,.es,.jsx --out-dir lib
輸出目錄的結構
lib
├── bar.js
├── foo.js
├── foo.js.map
├── MyComponent.js
└── MyComponent.js.map
具體解釋一下各個命令的作用:
第一條命令 ./node_moles/.bin/rimraf lib
作用 編譯前清空之前的 lib 目錄,這是一個好習慣,可以杜絕對 lib 下的文件的任何手動更改。
第二條命令
./node_moles/.bin/babel src --out-dir lib --source-maps --extensions .es6,.es,.jsx ---files
作用 遍歷 src 目錄下的文件,如果後綴名是 .es/.es6/.jsx 中的一種,就編譯成 ES5,否則就直接拷貝到輸出目錄 lib 下
參數詳解:
--out-dir lib 指定輸出目錄為 lib
--extensions .es6,.es,.jsx 指定需要編譯的文件類型
---files 對於不需要編譯的文件直接拷貝
--source-maps 生成 souce-map 文件
編譯過程中還隱含了一個步驟就是載入 .babelrc 文件里的配置,該文件內容如下
{
"presets": [
"es2015",
"stage-0",
"react"
]
}
這是因為 Babel6 採用了插件化的設計,做到了靈活配置:如果要轉換 JSX 語法文件,就加上 react 的 preset,同時項目依賴里要添加
babel-preset-react
npm install babel-preset-react --save-dev
樣例代碼
開發和調試 React 模塊目前最好用的打包工具還是 Webpack,在項目跟目錄下,新建一個 example 目錄:
example/index.html
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>Example</title>
</head>
<body></body>
<script src="bundle.js"></script>
</html>
example/src/index.jsx
import React from 'react';
import MyComponent,{foo,bar} from '../../';
import {render} from 'react-dom';
var element = document.createElement("div");
document.body.appendChild(element);
render(<MyComponent name="myComponent"/>, element);
webpack.config.js
var path = require('path');
mole.exports = {
entry: path.join(__dirname, 'example', 'src', 'index.jsx'),
output: {
filename: 'bundle.js'
},
mole: {
loaders: [{
test: /\.jsx$/,
loader: 'babel',
include: [
path.join(__dirname, 'example')
]
}]
},
devServer: {
contentBase: path.join(__dirname, 'example')
}
}
運行樣例代碼
./node_moles/.bin/webpack-dev-server
發布
發布前,還有一件事就是為你的模塊添加一個入口文件 index.js
mole.exports = require('./lib/MyComponent');
exports.default = require('./lib/MyComponent');
exports.bar = require('./lib/bar');
exports.foo = require('./lib/foo');
接下來就是發布到 NPM 了。
npm publish
使用
別的開發者在使用你新發布的模塊的時候可以這樣導入
import MyComponent,{foo,bat} from 'react-component-example'
導入的直接是 ES5 代碼,跳過編譯從而避免了出現 Babel 版本不一致的問題,並且速度更快,是不是很棒!
不過假設你的模塊包含很多組件,開發者可能只想用其中的一個或某幾個,這時可以這樣導入:
import MyComponent from 'react-component-example/src/MyComponent.jsx'
導入的是 ES6 代碼,並且會被加入父級項目的編譯過程。
『伍』 有人知道reactos 0.3.3怎麼編譯嗎
好像沒有這個軟體
『陸』 你們react 項目編譯環境是完全在自己配置還是用
webpack只會生成一個叫做bundle.js的文件,所有的資源文件都被打包到了這個文件上,運行網站也不是直接運行html的,要用npm來運行
『柒』 如何使用react-tools將jsx編譯成JavaScript
1,通過npm安裝react-tools
npm –g react-tools
2,通過cmd進入項目根目錄執行watch命令 jsx --watch src/ build/
src路徑下存放的是jsx文件,編譯後的js存放到build路徑下
3,當目標文件變化以後,自動構建生成新的js文件。
『捌』 如何編譯ReactNative示常式序Examples
本著什麼都要攙和的原則,一起來看看React Native是如何開發iOS APP。
圍觀本文需自備Mac OSX , XCode , node 以及 npm 。
做好准備之後,打開你的終端(或其他命令行利器),鍵入下面命令:
npm install -g react-native-cli
和
react-native init AwesomeProject
此時,我們會看到一個名為AwesomeProject的文件夾,這就是工程文件的位置。使用XCode打開AwesomeProject.xcodeproj,並點擊RUN,會看到iOS模擬器以及此項目對應的內容,效果如下:
如果想要修改顯示內容,請打開index.ios.js,裡面是一堆Javascript模樣的東西。修改之後,在iOS模擬器中cmd+R就可以看到修改後的效果。
接下來,我們按照教程,來展示一張電影海報,為了方便,我們直接修改index.ios.js。