从头开始构建一个自己的react项目

原文链接:https://www.robinwieruch.de/minimal-react-webpack-babel-setup/
本文对原文进行了粗略的翻译~~旨在帮助刚入门的新手迅速了解构建一个基于webpack打包的react项目。

Project setup 配置项目

1.首先使用下面的命令来创建一个项目:

mkdir minimal-react-boilerplate 
cd minimal-react-boilerplate 
npm init -y

npm init 会生成一个package.json文件,-y命令则是所有的选项都用默认选项.

2.创建一个分布式(?)文件夹,该文件夹用来为单页应用(SPA)服务,使得应用可以在浏览器环境或者外部服务器被访问到。该文件夹会包括两个文件:一个html和一个js,js会由webpack配置好的js资源来自动生成,你可以手动创建一个html文件作为应用的入口。

注释:这个html和js就是你程序发布的所有内容了。

html的内容如下所示:

<!DOCTYPE html>
<html>
  <head>
      <title>The Minimal React Webpack Babel Setup</title>
  </head>
  <body>
    <div id="app"></div>
    <script src="bundle.js"></script>
  </body>
</html>

说明两点:

  • bundle.js会被webpack生成,

  • id=“app”会作为react根节点来找到入口的标识。

接下来要做的就是把所有的资源文件打包成一个bundle.js,创建一个根组件将id=“app”作为文件的入口

Webpack Setup 配置webpack

使用webpack来打包,为了能在localhost环境访问到,并在浏览器里开发,需要同时安装webpack-dev-server,才能启动服务器。

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

现在你应该有node_modules文件夹,这里你可以看到你安装的第三方依赖,因为使用了--save-dev,这些依赖会被写在package.json文件中。

接下来在package.json中配置webpack-dev-server的运行

"scripts":{

    "start":"webpack-dev-server --progress --colors --hot --config ./webpack.config.js",

     ...

},

这个运行脚本定义了你需要使用一些基本的配置来使用webpack-dev-server,需要创建配置文件webpack.config.js

module.exports = {
    entry: ['./src/index.js'],
    output: { 
      path:__dirname + '/dist', 
      publicPath: '/',
      filename: 'bundle.js'
    },
   devServer: {
      contentBase: './dist'
   }
};

简单的说这个配置文件做了三件事:

  • 1.我们使用src/index.js来做为打包的入口文件

  • 2.打包后的文件是bundle.js

  • 3.bundle.js生成在dist文件夹下,dist文件夹被用来启动我们的app

我们的项目里还少了一个src/index.js文件,因为它是我们的entry文件么~remember
在src/index.js中输入
The Minimal React Webpack Babel Setup
现在你的项目结构是这样的

- dist
-- index.html
- node_modules
- src
-- index.js
- package.json
- webpack.config.js

接下来就可以运行你的webpack-dev-server了,

通过当前目录下(你项目所在的目录)启动命令行 ,运行项目
npm start

image.png

就可以看到项目已经运行成功了,这时候在浏览器中键入你的localhost地址,如图中,我的运行端口是8081;(一般情况是8080,当被占用时会往后增加)
http://localhost:8081
就可以在浏览器的控制台console.log()中看到你写入的文字了~
现在你通过webpack来运行了你的项目,把你的入口文件src/index.js打包成了bundle.js,然后将它引入到了dist/index.html,最后你就可以在console.log中看到你想要的结果了。
虽然目前只有src/index.js被打包了,但是你肯定会在index.js中引入更多的js,这些都会被webpack自动打包到bundle.js中。赞不赞?

Hot Reloading 热加载

react-hot-loader是非常值得推荐给你的,它会大大缩短你开发到看到效果的时间,简单的说,热加载的作用就是当你修改了一部分源代码,这个变化会立刻表现在浏览器上,而无需通过你刷新整个页面。
在根目录安装
npm install --save-dev react-hot-loader
提示:在命令行,按control+c可以取消npm start的运行,然后安装完成后需要再次运行npm start
想要热加载生效,我们还需要在webpack.config.js这个配置文件增加一些配置。

module.exports = {
  entry: [
     'webpack-dev-server?http://localhost:8081', // 你的应该是8080
    'webpack/hot/only-dev-server',
    './src/index.js',
  ], 
  output: {
    path: __dirname + '/dist',
    publicPath: '/',
    filename: 'bundle.js'
  },
  devServer: {
    contentBase: './dist',
    hot: true
  }
}

同时在src/index.js文件里还需定义热加载是可以使用的并且需要被使用。
src/index.js文件的内容:

console.log('My Minimal React Webpack Babel Setup');
module.hot.accept();

重新跑一下npm start,webpack的配置文件修改了是需要重新启动的。
运行后你又可以在浏览器的控制台里看到console.log()的内容了,同时还能看到一些与热加载有关的打印,不用去看它们。先来试试我们的热加载好了没,当你修改你的console.log()内容后,保存,看看浏览器是不是自己更新了,恭喜~~
到这里webpack的基本配置已经好了,但是还少了一个重要的模块——Babel

Babel Setup 配置babel

Babel可以使你尽情的使用es6的语法,使用Babel你的代码会被编译成es5,这样的话所有的浏览器,可能只支持部分的es6,也可以支持你的代码。Babel甚至还允许你使用比es6还先进的语法下一代eses7
打开命令行,让我们赶紧使用吧
npm install --save-dev babel-core babel-loader babel-preset-es2015
此外你可能还想使用一些在试验阶段的es6特性(比如对象扩展符{...}),这些可以通过stages来激活。不用担心它的稳定性,因为已经被Facebook用来在create-react-app中使用了。
怎么使用stages?
npm install --save-dev babel-preset-stage-2
最后一步,鉴于你是要用react的,你需要多一些配置来把react的jsx文件转换成js文件,这是为了方便。
npm install --save-dev babel-preset-react
现在所有的node包都已经安装到位,你接下来还需修改一下package.json和webpack.config.js文件,这些变化包括你所有安装的包。
package.json中

...
"keywords": [],
"author": "",
"license": "ISC",
"babel": {
  "presets": [
    "es2015",
    "react",
    "stage-2"
  ]
},
"devDependencies": {
...

webpack.config.js中

module.exports = {
  entry: [
    'webpack-dev-server/client?http://localhost:8080',
    'webpack/hot/only-dev-server',
    './src/index.js'
  ],
  module: {
    loaders: [{
      test: /\.jsx?$/,
      exclude: /node_modules/,
      loader: 'react-hot-loader!babel-loader'
    }]
  },
  resolve: {
    extensions: ['*', '.js', '.jsx']
  },
  output: {
    path: __dirname + '/dist',
    publicPath: '/',
    filename: 'bundle.js'
  },
  devServer: {
    contentBase: './dist',
    hot: true
  }
};

对module模块中的loaders是个数组,表示不同的加载器,test是要匹配的文件后缀为.jsx,exclude是把node_modules排除在外。具体内容本篇文件并未详述。

在此时运行npm start 将会报错,因为你的应用还不识别react。
因为我们马上就要进行第一个react组件的开发了,让我们来修复下~

React Setup 使用React

为了使用react,你还需要安装两个node包,react和react-dom,这两个安装完后npm start 也不会报错了
npm install --save react react-dom
然后在src/index.js中编写你的链接react的第一个组件吧
src/index.js中

import React from 'react';
import ReactDOM from 'react-dom';

const title = 'My Minimal React Webpack Babel Setup';

ReactDOM.render(
  <div>{title}</div>,
  document.getElementById('app')
);

module.hot.accept();

到今天,不得不说这篇文章已经过时了,因为react和各种node包的版本更新速度太快,这个项目已经跑不起来,如果非要跑起来,可以安装历史版本

npm install react-hot-loader@1.3.1 --save-dev
npm install react@15.3.0 --save-dev
npm install react-dom@15.0.2 --save-dev

所以从今天开始还是要多写博客,多总结,以后再回头看,自己应该有了长足的进步吧,以前写的文章该有多~~
到这里,打开浏览器应该就可以看到页面上输出了内容,而不是再在控制台上了
至此,一个迷你型的react项目就搭建完成了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容