感謝原文鏈接?https://www.valentinog.com/blog/react-webpack-babel/
源碼 可以查看github地址? https://github.com/rayyuan90/webpack-with-react-
目錄
如何建立React岳锁,的WebPack和Babel:你將學(xué)到什么
如何建立React宣虾,的WebPack和Babel:建立項(xiàng)目
如何建立React畜份,的WebPack和Babel:設(shè)立的WebPack
如何建立React玄叠,的WebPack和Babel:建立Babel
如何建立React,的WebPack和Babel:寫作React的組分
如何建立React摆马,的WebPack和Babel:在HTML的WebPack插件
如何建立React臼闻,的WebPack和Babel:的WebPack開發(fā)服務(wù)器
如何建立React,的WebPack和Babel:結(jié)束了
如何建立React囤采,的WebPack和Babel:你將學(xué)到什么
如何安裝和配置的WebPack
如何安裝和配置通天塔
如何安裝陣營
如何創(chuàng)建兩個(gè)按照集裝箱/表象原則React的組分
如何將得到的束到HTML頁面
如何安裝和配置的WebPack開發(fā)服務(wù)器
應(yīng)對(duì)不限于完全成熟的SPA述呐。這是可能的庫集成到任何現(xiàn)有的網(wǎng)站。
React可以在任何一個(gè)CDN或一個(gè)模塊捆綁拉蕉毯。
對(duì)于大多數(shù)我的項(xiàng)目我使用的WebPack:結(jié)合React乓搬,是的WebPack容易,因?yàn)橐患p而易舉的事代虾。
你可以這樣做进肯,有一個(gè)工作的WebPack 4?-在幾分鐘內(nèi)做出React的環(huán)境:這里是給你一個(gè)簡短的教程。
如何建立 react褐着,WebPack和Babel:建立項(xiàng)目
通過創(chuàng)建項(xiàng)目的目錄開始:mkdir webpack-react-tutorial && cd webpack-react-tutorial
用于固定代碼創(chuàng)建一個(gè)最小的目錄結(jié)構(gòu):mkdir -p src
Inizialize通過運(yùn)行項(xiàng)目:npm init -y
開始吧坷澡。
如何建立React,WebPack和Babel的項(xiàng)目
WebPack是現(xiàn)代Web發(fā)展的支柱之一含蓉。這是一個(gè)令人難以置信的強(qiáng)大的工具频敛。
如何使用的WebPack是與React工作的根本。
WebPack攝取原React的組分用于生產(chǎn)JavaScript代碼(幾乎)所有瀏覽器都能理解馅扣。
讓我們通過運(yùn)行安裝:npm i webpack --save-dev
您還需要 WebPack-CLI 運(yùn)行npm~命令:npm i webpack-cli --save-dev
接下來在添加?webpack命令 到 package.json:
"scripts": {
? "build": "webpack --mode production"
}
在這一點(diǎn)上斟赚,沒有必要定義配置文件的WebPack。
年長的WebPack的版本并自動(dòng)尋找的配置文件差油。
以來第4版已不再的情況下:您可以開始開發(fā)straigh了拗军。
在下一節(jié)中,我們將安裝和transpiling我們的代碼配置通天塔蓄喇。
如何建立React发侵,的WebPack和Babel:建立Babel
React的組分大多以JavaScript寫成ES6。
因?yàn)樗麄內(nèi)ツ抢锸切枰撤N變換的瀏覽器不能理解React的組分妆偏。
的WebPack不知道如何進(jìn)行轉(zhuǎn)型刃鳄,但它有裝載機(jī)的概念:認(rèn)為他們作為變壓器。
一的WebPack裝載機(jī)需要的東西作為輸入钱骂,并產(chǎn)生別的東西作為輸出叔锐。
巴貝爾裝載機(jī)Babel裝載機(jī)是的WebPack裝載機(jī)負(fù)責(zé)獲取在ES6代碼挪鹏,使之理解的首選瀏覽器。
ObsviuslyBabel-loaderbabel-loadermakes使用通天愉烙。而Babel必須配置為使用一串預(yù)設(shè)的:
Babel?preset?ENV 編譯的Javascript代碼ES6下降到ES5(請(qǐng)注意讨盒,Babel預(yù)設(shè)-ES2015現(xiàn)在已經(jīng)過時(shí))
Babel??preset?React 編譯JSX和其他的東西下來的Javascript
讓我們把與依賴關(guān)系 dependencies?加入項(xiàng)目 執(zhí)行:npm i @babel/core babel-loader @babel/preset-env @babel/preset-react --save-dev
不要忘了配置Babel!創(chuàng)建一個(gè)名為.babelrc 文件在項(xiàng)目文件夾中:
{
? "presets": ["@babel/preset-env", "@babel/preset-react"]
}
在這一點(diǎn)上我們就可以界定一個(gè)最小的WebPack配置步责。
創(chuàng)建一個(gè)名為webpack.config.js 文件填補(bǔ)像以下文件:
module.exports = {
? module: {
? ? rules: [
? ? ? {
? ? ? ? test: /\.js$/,
? ? ? ? exclude: /node_modules/,
? ? ? ? use: {
? ? ? ? ? loader: "babel-loader"
? ? ? ? }
? ? ? }
? ? ]
? }
};
配置是相當(dāng)簡單的返顺。
對(duì)于具有.js.jsextension的WebPack管道通過通天塔-? loaderbabel加載器的代碼轉(zhuǎn)化器ES6下降到ES5每個(gè)文件。
有了這個(gè)地方勺择,我們已經(jīng)準(zhǔn)備好寫我們的React的組分创南。
讓我們頭以上下一節(jié)。
如何建立React省核,的WebPack和Babel:寫作React的組分
我喜歡寫我按照集裝箱/表象原則React的組分稿辙。
我建議考慮看看容器組件和聰明和愚蠢的組件由丹·阿布拉莫夫?qū)W習(xí)更多。
總之气忠,集裝箱/表象原則是React的組分的模式邻储。
該容器組件是攜帶所有的邏輯的一個(gè):用于處理狀態(tài)的變化,內(nèi)部組件狀態(tài)等的功能旧噪。
在對(duì)比度的表象的部件僅僅是用于顯示所期望的標(biāo)記吨娜。表象組分通常是純箭頭功能和從所述容器部件作為接收數(shù)據(jù)道具。
你會(huì)看到他們是怎么看起來像下面的例子淘钟。
對(duì)于這個(gè)職位的范圍宦赠,我想建立一個(gè)超級(jí)簡單的形式做出React具有單個(gè)文本輸入。
觸摸之前的任何代碼米母,讓我們?cè)谶\(yùn)行:
npm i react react-dom --save-dev
然后創(chuàng)建組織的組件最小目錄結(jié)構(gòu):
mkdir -p src/js/components/{container,presentational}
接下來勾扭,讓我們創(chuàng)建一個(gè)容器組件:
有它自己的狀態(tài)
渲染HTML表單
創(chuàng)建組件到SRC / JS /組件/容器/ SRC / JS /組件/容器/:
觸摸的src / JS /組件/容器/ FormContainer.js
觸摸的src /
? ? JS /組件/容器/? ? FormContainer.js
觸摸的src / JS /組件/容器/ FormContainer.js
該組件將如下所示:
進(jìn)口反應(yīng),{元器件}從“反應(yīng)”;
從 “反應(yīng)-DOM” 進(jìn)口ReactDOM;
類FormContainer延伸元器件{
? 構(gòu)造(){
??? 超();
??? this.state = {
????? 標(biāo)題:“”
??? };
? }
? 渲染(){
??? 返回(
????? <表格ID =“文章形式”>
??? );
? }
}
出口默認(rèn)FormContainer;
進(jìn)口React铁瞒,{元器件}從“React”;
進(jìn)口 ReactDOM從“React-DOM”;
類 FormContainer擴(kuò)展組件{
構(gòu)造(){
超();
this.state= {
標(biāo)題:“”
};
}
渲染(){
返回(
<表格ID =“文章形式”>
</形式>
);
}
}
出口默認(rèn)FormContainer;
進(jìn)口反應(yīng)妙色,{元器件}從“反應(yīng)”;
從 “反應(yīng)-DOM” 進(jìn)口ReactDOM;
類FormContainer延伸元器件{
? 構(gòu)造(){
??? 超();
??? this.state = {
????? 標(biāo)題:“”
??? };
? }
? 渲染(){
??? 返回(
????? <表格ID =“文章形式”>
??? );
? }
}
出口默認(rèn)FormContainer;
該組件什么也不做,在這一刻慧耍。它只是結(jié)束了子組件的骨架身辨。
實(shí)際上,如果沒有它的表象子容器組件幾乎是無用的芍碧。
讓我們來解決這個(gè)問題煌珊。
創(chuàng)建的src / JS /組件/表象/ src目錄中的新組件/ JS /組件/表象/:
觸摸的src / JS /組件/表象/ Input.js
觸摸的src /
? ? JS /組件/表象/ Input.js
觸摸的src / JS /組件/表象/ Input.js
我們的第一個(gè)表象作出React組件將是一個(gè)文字輸入。我們知道泌豆,一個(gè)HTML輸入采用以下屬性:
類型
類
ID
值
需要
所有這些都將成為道具定庵,容器組件將傳承給其表象的孩子。
由于輸入擁有自己的狀態(tài),我們必須確保陣營將照顧它洗贰。一個(gè)HTML輸入變?yōu)?a target="_blank" rel="nofollow">在陣營控制的部件。
說起道具陨倡,這是很好的做法與記錄您的React的組分道具類型敛滋。
通過運(yùn)行安裝包:
NPM我丙種--save-dev的
NPM我丙種--save-dev的
NPM我丙種--save-dev的
回React,我們的表象成分為HTML的輸入將如下所示:
進(jìn)口從“反應(yīng)”反應(yīng);
從“道具類型”進(jìn)口PropTypes;
常量輸入=({標(biāo)簽兴革,文本绎晃,類型,識(shí)別符杂曲,值庶艾,handleChange})=>(
??? <標(biāo)簽htmlFor = {標(biāo)簽}> {文本} </標(biāo)簽>
??? <輸入
????? 類型= {}類型
????? 類名=“形式控制”
????? ID = {ID}
????? 值= {}值
????? 的onChange = {handleChange}
????? 需要
??? />
);
Input.propTypes = {
? 標(biāo)簽:PropTypes.string.isRequired,
? 文本:PropTypes.string.isRequired擎勘,
? 類型:PropTypes.string.isRequired咱揍,
? ID:PropTypes.string.isRequired,
? 值:PropTypes.string.isRequired棚饵,
? handleChange:PropTypes.func.isRequired
};
出口默認(rèn)輸入;
進(jìn)口從“React”React;
進(jìn)口從“道具類型” PropTypes;
常量輸入=({標(biāo)簽煤裙,文本,類型噪漾,識(shí)別符硼砰,值,handleChange})=>(
<格的className =“形式的基團(tuán)”>
<標(biāo)簽htmlFor = {標(biāo)簽}> {文本} </標(biāo)簽>
<輸入
類型= {}類型
類名=“形式控制”
ID =? ? {ID}
值= {}值
的onChange? ? = {handleChange}
需要
/>
</DIV>
);
Input.propTypes? ? = {
標(biāo)簽:PropTypes.string.isRequired欣硼,
文本:PropTypes.string.isRequired题翰,
類型:PropTypes.string.isRequired,
ID:PropTypes.string.isRequired诈胜,
值:PropTypes.string.isRequired豹障,
handleChange:PropTypes.func.isRequired
};
出口默認(rèn)的輸入;
進(jìn)口從“反應(yīng)”反應(yīng);
從“道具類型”進(jìn)口PropTypes;
常量輸入=({標(biāo)簽,文本耘斩,類型沼填,識(shí)別符,值括授,handleChange})=>(
??? <標(biāo)簽htmlFor = {標(biāo)簽}> {文本} </標(biāo)簽>
??? <輸入
????? 類型= {}類型
????? 類名=“形式控制”
????? ID = {ID}
????? 值= {}值
????? 的onChange = {handleChange}
????? 需要
??? />
);
Input.propTypes = {
? 標(biāo)簽:PropTypes.string.isRequired坞笙,
? 文本:PropTypes.string.isRequired,
? 類型:PropTypes.string.isRequired荚虚,
? ID:PropTypes.string.isRequired薛夜,
? 值:PropTypes.string.isRequired,
? handleChange:PropTypes.func.isRequired
};
出口默認(rèn)輸入;
在這一點(diǎn)上版述,我們就可以更新我們的容器組件梯澜,包括文本輸入:
進(jìn)口反應(yīng),{元器件}從“反應(yīng)”;
從 “反應(yīng)-DOM” 進(jìn)口ReactDOM;
從“../presentational/Input”進(jìn)口輸入;
類FormContainer延伸元器件{
? 構(gòu)造(){
??? 超();
??? this.state = {
????? seo_title:“”
??? };
??? this.handleChange = this.handleChange.bind(本);
? }
? handleChange(事件){
??? this.setState({[event.target.id]:event.target.value});
? }
? 渲染(){
??? 常量{seo_title} = this.state;
??? 返回(
????? <表格ID =“文章形式”>
??????? <輸入
????????? 文字=“搜索引擎優(yōu)化稱號(hào)”
????????? 標(biāo)簽= “seo_title”
????????? 類型=“文本”
????????? ID = “seo_title”
????????? 值= {seo_title}
????????? handleChange = {this.handleChange}
??????? />
??? );
? }
}
出口默認(rèn)FormContainer;
進(jìn)口React渴析,{元器件}從“React”;
進(jìn)口 ReactDOM從“React-DOM”;
進(jìn)口從“../presentational/Input”輸入;
類 FormContainer擴(kuò)展組件{
構(gòu)造(){
超();
this.state= {
seo_title:“”
};
this.handleChange =
? ? this.handleChange.bind(本);
}
handleChange(事件){
this.setState({ [event.target.id]:event.target.value});
}
渲染(){
常量{seo_title} = this.state;
返回(
<表格ID =“文章形式”>
<輸入
文字=“搜索引擎優(yōu)化稱號(hào)”
標(biāo)簽=? ? “seo_title”
類型=“文本”
ID =? ? “seo_title”
值=? ? {seo_title}
handleChange? ? = {this.handleChange}
/>
</形式>
);
}
}
出口默認(rèn)FormContainer;
進(jìn)口反應(yīng)晚伙,{元器件}從“反應(yīng)”;
從 “反應(yīng)-DOM” 進(jìn)口ReactDOM;
從“../presentational/Input”進(jìn)口輸入;
類FormContainer延伸元器件{
? 構(gòu)造(){
??? 超();
??? this.state = {
????? seo_title:“”
??? };
??? this.handleChange = this.handleChange.bind(本);
? }
? handleChange(事件){
??? this.setState({[event.target.id]:event.target.value});
? }
? 渲染(){
??? 常量{seo_title} = this.state;
??? 返回(
????? <表格ID =“文章形式”>
??????? <輸入
????????? 文字=“搜索引擎優(yōu)化稱號(hào)”
????????? 標(biāo)簽= “seo_title”
????????? 類型=“文本”
????????? ID = “seo_title”
????????? 值= {seo_title}
????????? handleChange = {this.handleChange}
??????? />
??? );
? }
}
出口默認(rèn)FormContainer;
時(shí)間連線的事情了吮龄。
預(yù)計(jì)的WebPack切入點(diǎn)是./src/index.js./src/index.js
創(chuàng)建./src/index.js./src/index.jsand放置一個(gè)import指令到它需要容器組件:
進(jìn)口FormContainer從“./js/components/container/FormContainer”;
進(jìn)口 FormContainer從“./js/components/container/FormContainer”;
進(jìn)口FormContainer從“./js/components/container/FormContainer”;
有了這個(gè)地方,我們已經(jīng)準(zhǔn)備好運(yùn)行創(chuàng)造我們的包:
NPM運(yùn)行構(gòu)建
NPM運(yùn)行構(gòu)建
NPM運(yùn)行構(gòu)建
給的WebPack第二咆疗,看包來的生活漓帚!
束將被放置到
./dist/main.js
./dist/main.js
./dist/main.js
現(xiàn)在,讓我們把我們做出React的實(shí)驗(yàn)生活由包括捆綁到HTML頁面午磁。
如何建立React尝抖,的WebPack和Babel:在HTML的WebPack插件
為了顯示我們的形式作出React,我們必須告訴的WebPack生成一個(gè)HTML頁面迅皇。將所得的束將放在一個(gè)<SCRIPT> </
SCRIPT> <SCRIPT> </ SCRIPT>標(biāo)記內(nèi)昧辽。
Webpacks需要處理HTML另外兩個(gè)組成部分:HTML-的WebPack-插件和HTML裝載機(jī)。
添加依賴與:
NPM我的HTML的WebPack-插件HTML裝載機(jī)--save-dev的
NPM我的HTML的WebPack-插件HTML裝載機(jī)--save-dev的
NPM我的HTML的WebPack-插件HTML裝載機(jī)--save-dev的
然后更新的WebPack配置:
常量HtmlWebPackPlugin =需要( “HTML-的WebPack-插件”);
module.exports = {
? 模塊:{
??? 規(guī)則:
????? {
??????? 測試:/\.js$/登颓,
??????? 排除:/ node_modules /搅荞,
??????? 使用:{
????????? 裝載機(jī):“巴別塔裝載機(jī)”
??????? }
????? },
????? {
??????? 測試:/\.html$/挺据,
??????? 使用:[
????????? {
??????????? 裝載機(jī):“HTML裝載機(jī)”
????????? }
??????? ]
????? }
??? ]
? }取具,
? 插件:
??? 新HtmlWebPackPlugin({
????? 模板:“./src/index.html”
????? 文件名:“./index.html”
??? })
? ]
};
常量 HtmlWebPackPlugin =需要( “HTML-的WebPack-插件”);
module.exports? ? = {
模塊:{
規(guī)則:
{
測試:/\.js$/,
排除:/
? ? node_modules /扁耐,
使用:{
裝載機(jī):“巴別塔裝載機(jī)”
}
}暇检,
{
測試:/\.html$/,
使用:[
{
裝載機(jī):“HTML裝載機(jī)”
}
]
}
]
}婉称,
插件:
新 HtmlWebPackPlugin({
模板:“./src/index.html”
文件名:“./index.html”
})
]
};
常量HtmlWebPackPlugin =需要( “HTML-的WebPack-插件”);
module.exports = {
? 模塊:{
??? 規(guī)則:
????? {
??????? 測試:/\.js$/块仆,
??????? 排除:/ node_modules /,
??????? 使用:{
????????? 裝載機(jī):“巴別塔裝載機(jī)”
??????? }
????? }王暗,
????? {
??????? 測試:/\.html$/悔据,
??????? 使用:[
????????? {
??????????? 裝載機(jī):“HTML裝載機(jī)”
????????? }
??????? ]
????? }
??? ]
? },
? 插件:
??? 新HtmlWebPackPlugin({
????? 模板:“./src/index.html”
????? 文件名:“./index.html”
??? })
? ]
};
接下來reate一個(gè)HTML文件到./src/index.html./src/index.html(feel自由使用你喜歡的任何CSS庫):
<俗壹!DOCTYPE HTML>
<HTML語言= “EN”>
??? <元的charset = “UTF-8”>
??? <鏈路的rel = “樣式表的” href = “https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css”>
??? 如何設(shè)置反應(yīng)科汗,的WebPack,和巴別</ TITLE>
創(chuàng)建一個(gè)新的文章
??????????????????? <绷雏! - 表- >
<头滔!DOCTYPE HTML>
<HTML 郎= “EN”>
<HEAD>
<元字符集= “UTF-8”>
<鏈接的rel = “樣式表的” href =? ? “https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css”>
<TITLE>如何建立React,的WebPack和Babel
</ HEAD>
<BODY>
<DIV 類=“容器”>
<DIV 類= “行MT-5”>
<DIV 類= “COL-MD-4偏移-MD-1”>
<P>創(chuàng)建一個(gè)新的文章
<DIV ID = “創(chuàng)建-文章形式”>
<涎显! - 表 -
? ? >
</ DIV>
</ DIV>
</ DIV>
</ DIV>
</ BODY>
</ HTML>
<坤检!DOCTYPE HTML>
<HTML語言= “EN”>
??? <元的charset = “UTF-8”>
??? <鏈路的rel = “樣式表的” href = “https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css”>
??? 如何設(shè)置反應(yīng),的WebPack期吓,和巴別</ TITLE>
創(chuàng)建一個(gè)新的文章
??????????????????? <早歇! - 表- >
最后一件事是失蹤了!我們要告訴我們的陣營組件本身掛鉤到<DIV ID = “創(chuàng)建-文章形式”> </ DIV> <DIV ID = “創(chuàng)建-文章形式”> </ div>上。
打開./src/js/components/container/FormContainer.js./src/js/components/container/FormContainer.jsand添加以下的文件的底部:
常量包裝=的document.getElementById( “創(chuàng)建-物品形式”);
包裝器箭跳?ReactDOM.render(<FormContainer />晨另,包裝器):假;
常量包裝=的document.getElementById( “創(chuàng)建-物品形式”);
包裝器?ReactDOM.render(<FormContainer />谱姓,包裝器):假;
常量包裝=的document.getElementById( “創(chuàng)建-物品形式”);
包裝器拯刁?ReactDOM.render(<FormContainer />,包裝器):假;
關(guān)閉并保存文件逝段。
現(xiàn)在再次運(yùn)行編譯:
NPM運(yùn)行構(gòu)建
NPM運(yùn)行構(gòu)建
NPM運(yùn)行構(gòu)建
看一看在./dist./distfolder。你應(yīng)該可以看到生成的HTML割捅。
隨著的WebPack有沒有需要包括在HTML文件中你的Javascript:捆綁將被自動(dòng)注入到該頁面奶躯。
打開./dist/index.html./dist/index.htmlin您的瀏覽器:你應(yīng)該看到的作出React形式。
如何建立React亿驾,的WebPack和Babel:的WebPack開發(fā)服務(wù)器
你不想打字NPM運(yùn)行buildnpm運(yùn)行更改文件buildevery時(shí)間嘹黔。
只需3配置的線路有一個(gè)開發(fā)服務(wù)器運(yùn)行起來。
一旦配置的WebPack將推出瀏覽器中您的應(yīng)用程序莫瞬。
此外儡蔓,每次保存修改的WebPack WEV服務(wù)器后的文件將自動(dòng)地刷新瀏覽器窗口。
要設(shè)置的WebPack dev的服務(wù)器安裝軟件包:
NPM我的WebPack-DEV-服務(wù)器--save-dev的
NPM我的WebPack-DEV-服務(wù)器--save-dev的
NPM我的WebPack-DEV-服務(wù)器--save-dev的
打開package.jsonpackage.jsonto加入啟動(dòng)腳本:
“腳本”:{
? “開始”: “的WebPack-DEV-服務(wù)器--open --mode發(fā)展”疼邀,
? “建”: “的WebPack”
}
“腳本”:{
“開始”: “的WebPack-DEV-服務(wù)器--open --mode發(fā)展”喂江,
“建立”: “的WebPack”
}
“腳本”:{
? “開始”: “的WebPack-DEV-服務(wù)器--open --mode發(fā)展”,
? “建”: “的WebPack”
}
保存并關(guān)閉文件旁振。
現(xiàn)在获询,通過運(yùn)行:
NPM啟動(dòng)
NPM啟動(dòng)
NPM啟動(dòng)
你應(yīng)該看到的WebPack啟動(dòng)瀏覽器內(nèi)你的應(yīng)用程序。
的WebPack開發(fā)服務(wù)器將自動(dòng)地在每次修改文件刷新窗口拐袜!
如何建立React吉嚣,的WebPack和Babel:結(jié)束了
React大多用于創(chuàng)建單頁的應(yīng)用程序。但它也可以裝到任何網(wǎng)站蹬铺。
通過組合的WebPack和巴別能夠一堆React的組分變換成適合于被分發(fā)束尝哆。
在上述指南中,我們已經(jīng)看到:
如何安裝和配置的WebPack
如何安裝和配置通天塔
如何安裝陣營
如何創(chuàng)建兩個(gè)按照集裝箱/表象原則React的組分
如何將得到的束到HTML頁面
如何安裝和配置的WebPack開發(fā)服務(wù)器
截至去年底甜攀,你應(yīng)該能夠從頭與React秋泄,以及的WebPackBabel開始。
為了更多地了解的WebPack退房的WebPack 4教程赴邻,從零到CONF生產(chǎn)模式印衔。
謝謝閱讀!
原文
教程:如何建立反應(yīng)姥敛,4的WebPack和巴貝爾7(2018)
提供更好的翻譯建議