react.js使用webpack搭配环境的入门教程


Posted in Javascript onAugust 14, 2017

本文介绍了react.js使用webpack搭配环境的入门教程,分享给大家,也给自己做个笔记

如果你想直接上手开发,而跳过这些搭配环境的繁琐过程,推荐你使用官方的create-react-app命令

npm install -g create-react-app //安装create-react-app脚手架 npm为node.js的包管理工具,请确保你已经安装了node.js
create-react-app my-app //使用create-react-app创建,my-app为项目名称
cd my-app/ //进入my-app目录
npm start //运行项目

现在打开 http://localhost:3000/ 就能看到初始界面

 我不大愿意使用官方自带这个脚手架,是因为它的webpack配置太复杂,我比较愚钝看不大懂,还望有大神能研究透彻分享一下。

要如何create-react-app内部的webpack配置文件解压出来?

npm run eject

源代码

每次看教程我都喜欢先把项目跑起来,然后再一句一句代码地去了解。如果你也是:

git clone https://github.com/lingjiawen/HelloReact.git
cd HelloReact/
npm install
npm run dev

一、创建项目结构

新建一个文件夹,命名为HelloReact

顺口提一下,我用的IDE是Sublime

在该文件夹内这样组织你的项目结构:

|--app   //项目组件
 |--components   //组件结构
 |---Hello.jsx
 |--main.js   //入口文件
|--build   //项目build文件
 |--index.html   //索引html
|--.babelrc   //babel转码工具配置文件

|--package.json  //npm说明文件,可以理解为包管理文件
|--webpack.config.js  //webpack配置文件

在build/index.html中拷贝以下代码:

<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title>ReactDemo1</title>
 </head>
 <body>
 <!--插入React组件的位置-->
 <div id="main">
 </div>
 <script src="bundle.js"></script>
 </body>
</html>

React代码插入到main中,而bundle.js是webpack打包生成的js文件,在这里你可以先帮它记下来下文看到了再回来一看就清楚了。

在package.json中输入以下代码:

注意,所有的注释都不要输入进去!

//package.json
{
 "name": "HelloReact",  //项目名字
 "version": "1.0.0",  //项目版本
 "main": "webpack.config.js", 
 "scripts": {
 "start": "webpack",  //npm start的配置
 },
 "author": "",   //作者
 "license": "ISC",
 "devDependencies": {
 //调试依赖项
 "babel-core": "^6.25.0",
 "babel-loader": "^7.1.1",
 "babel-plugin-react-transform": "^2.0.2",
 "babel-preset-es2015": "^6.24.1",
 "babel-preset-react": "^6.24.1",
 "react": "^15.6.1",
 "react-dom": "^15.6.1",
 "react-transform-hmr": "^1.0.4",
 "webpack": "^3.4.1",
 },
 "description": "",
 "dependencies": {
 //项目依赖项

 }
}

在webpack配置文件webpack.config.js中输入以下代码:

var webpack = require('webpack');//引入Webpack模块,注意这里只能使用ES5语法引入


module.exports = {
 entry: __dirname + "/app/main.js",//唯一入口文件
 output: {
 path: __dirname + "/build",//打包后的bundle.js文件存放的地方
 filename: "bundle.js" //打包后的文件名
 },
 module: {
 //loaders加载器
 loaders: [
  {
  test: /\.(js|jsx)$/, //匹配loaders所处理的文件的扩展名的正则,如jsx和js文件
  loader: 'babel-loader' //loader的名称
  }
 ]
 },
 plugins: [
 new webpack.HotModuleReplacementPlugin()//热模块替换插件
 ]
};

.babelrc是babel转码器的配置文件,它能将es6代码转换成es5代码,还支持react语法转换

在.babelrc中输入以下代码:

//.babelrc
{
 "presets": [
 "react",
 "es2015"
 ],
 "env": {
 "development": {
 "plugins": [
 [
  "react-transform",
  {
  "transforms": [
  {
  "transform": "react-transform-hmr",
  "imports": [
   "react"
  ],
  "locals": [
   "module"
  ]
  }
  ]
  }
 ]
 ]
 }
 }
}

在app/components/Hello.jsx中输入以下代码:

import React from 'react'; //引入react

//创建组件类:名字首字母必须大写
class Hello extends React.Component {
 render() {
 return (
  <div>Hello World!</div>
 )
 }
}

//导出组件
export default Hello;

React 使用 JSX 来替代常规的 JavaScript。

JSX 是一个看起来很像 XML 的 JavaScript 语法扩展。

它看起来是在Javascript代码里直接写XML的语法,而实质上是一个语法糖,每一个XML标签都会被JSX转换工具(如babel)转换成纯Javascript代码

在app/main.js中输入以下代码:

//main.js
import React from 'react';
import ReactDOM from 'react-dom';
import Hello from './components/Hello.jsx';

ReactDOM.render(
 <Hello />,
 document.getElementById('main')
);

二、运行项目

打开命令行,cd到HelloReact文件夹目录,运行

npm install

该命令会安装package.json的所有依赖文件,安装完成后,运行:

npm start

npm start命令是刚才你在package.json中定义的:

"scripts": {
 "start": "webpack",
 }

注:只有start可以省略run,其他都需要加上run,如 npm run dev;

你会发现build.js中多了bundle.js文件,这是你在webpack.config.js中定义的打包文件:

var webpack = require('webpack');//引入Webpack模块,注意这里只能使用ES5语法引入

module.exports = {
 ……
 output: {
 path: __dirname + "/build",//打包后的bundle.js文件存放的地方
 filename: "bundle.js" //打包后的文件名
 },
 ……
};

打开该目录下的index.html,看到以下输出运行成功:

react.js使用webpack搭配环境的入门教程

三、添加热替换模块

项目已经可以运行了,但是每次输完代码都要npm start进行打包,想想都没办法忍受,这就需要用到webpack-dev-server热替换模块,所见即所得

其实在前面的代码中,为了避免麻烦,我已经偷偷将热替换模块的部分配置加了进去

webpack.config.js中的

……
plugins: [
 new webpack.HotModuleReplacementPlugin()//热模块替换插件
 ]
……

package.json中的 

"devDependencies": {
 ……
 "babel-plugin-react-transform": "^2.0.2",
 "react-transform-hmr": "^1.0.4",
 "webpack-dev-server": "^2.6.1"
 ……
 }

还有.babelrc中的

"env": {
 "development": {
 "plugins": [
 [
  "react-transform",
  {
  "transforms": [
  {
  "transform": "react-transform-hmr",
  "imports": [
   "react"
  ],
  "locals": [
   "module"
  ]
  }
  ]
  }
 ]
 ]
 }
 }

你可以将这些代码删除,发现也是可以正常打包并运行。因为之前并没有用到热加载

那我现在想用,要怎么用呢?

很简单,在package.json中加入:

…… 
"scripts": {
 "start": "webpack",
 "dev": "webpack-dev-server"
 }
……

好,现在运行一下npm run dev

打开localhost:8080

react.js使用webpack搭配环境的入门教程

咦,怎么是列出文件列表,哦哦哦,原来是没有配置默认路径;

…… 
"scripts": {
 "start": "webpack",
 "dev": "webpack-dev-server --contentBase='./build' "
 }
……

重新运行npm run dev:

 react.js使用webpack搭配环境的入门教程

修改app/components/Hello.jsx

react.js使用webpack搭配环境的入门教程 

保存后再回到页面,发现页面已经自动更新:

react.js使用webpack搭配环境的入门教程

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScipt基本教程之JavaScript语言的基础
Jan 16 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
Mar 29 Javascript
js模拟select下拉菜单控件的代码
May 08 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
Sep 29 Javascript
javascript 通用loading动画效果实例代码
Jan 14 Javascript
浅谈JS日期(Date)处理函数
Dec 07 Javascript
javascript精确统计网站访问量实例代码
Dec 19 Javascript
基于JS实现新闻列表无缝向上滚动实例代码
Jan 22 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
Mar 15 Javascript
ES6中箭头函数的定义与调用方式详解
Jun 02 Javascript
zTree获取当前节点的下一级子节点数实例
Sep 05 Javascript
zTree异步加载展开第一级节点的实现方法
Sep 05 Javascript
JS原生数据双向绑定实现代码
Aug 14 #Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
Aug 14 #jQuery
关于在mongoose中填充外键的方法详解
Aug 14 #Javascript
JavaScript变量类型以及变量作用域详解
Aug 14 #Javascript
jQuery:unbind方法的使用详解
Aug 14 #jQuery
通过V8源码看一个关于JS数组排序的诡异问题
Aug 14 #Javascript
关于Vue Webpack2单元测试示例详解
Aug 14 #Javascript
You might like
php实现微信支付之企业付款
2018/05/30 PHP
基于jquery的表格排序
2010/09/11 Javascript
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
jQuery封装的tab选项卡插件分享
2015/06/16 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
分享一个精简的vue.js 图片lazyload插件实例
2017/03/13 Javascript
angular2+node.js express打包部署的实战
2017/07/27 Javascript
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
2020/05/06 Javascript
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
Python实现简易Web爬虫详解
2018/01/03 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
2018/02/22 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
2019/06/19 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
2019/06/20 Python
Flask教程之重定向与错误处理实例分析
2019/08/01 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
2020/02/12 Python
python模块如何查看
2020/06/16 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
2020/11/18 Python
python 实现波浪滤镜特效
2020/12/02 Python
利用CSS的Sass预处理器(框架)来制作居中效果
2016/03/10 HTML / CSS
css3实现冲击波效果的示例代码
2018/01/11 HTML / CSS
美国卡车、吉普车和SUV零件网站:4 Wheel Parts
2016/11/24 全球购物
Notino意大利:购买香水和化妆品
2018/11/14 全球购物
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
惠普新加坡官方商店:HP Singapore
2020/04/17 全球购物
ASP.NET中的身份验证有那些
2012/07/13 面试题
如何利用cmp命令比较文件
2016/04/11 面试题
销售员自我评价怎么写
2013/09/19 职场文书
初一英语教学反思
2014/01/11 职场文书
节约用电标语
2014/06/17 职场文书
信用卡工资证明范本
2014/10/17 职场文书
婚前协议书标准版
2014/10/19 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
大学校园招聘会感想
2015/08/10 职场文书
Django cookie和session的应用场景及如何使用
2021/04/29 Python