Webpack 4.x搭建react开发环境的方法步骤


Posted in Javascript onAugust 15, 2018

本文介绍了了Webpack 4.x搭建react开发环境的方法步骤,分享给大家,也给自己留个笔记

必要依赖一览(npm install) 安装好。

"dependencies": {
  "babel-core": "^6.26.3",
  "babel-loader": "^7.1.5",
  "babel-preset-env": "^1.7.0",
  "react": "^16.4.2",
  "react-dom": "^16.4.2",
  "webpack": "^4.16.5"
  ...
}

babel系列是干什么用的呢?是为了支持es6以上的高级语法的编译。但是因为react有jsx这个东西存在,所以单纯的babel是不够的,此外要让babel作用于webpack,需要给webpack添加一个loader(以前版本叫loader,4.x版本开始改用‘rules'),在工程根目录新建webpack.config.js文件,并添加如下代码:

var path = require('path');
var node_modules = path.resolve(__dirname, 'node_modules');
var deps = [ 
 ];

//以上代码可以忽略,没有必要不要添加noParse,因为依赖代码中可能会有环境的判断,而浏览器中是拿不到process变量的,会报错!
var config = {
  //这里是打包的入口
 entry: path.resolve(__dirname, './react/app.js'),
 resolve: {
  alias: {
  }
 },
 //打包完成后输出到./build/bundle.js文件中
 output: {
  path: path.resolve(__dirname, './build'),
  filename: 'bundle.js',
 },
 mode: 'development',
 module: {
   //上述的规则,loader就放在这里,这段没什么好说的,从Webpack官方文档上直接拿来用
  rules: [
    {
     test: /\.js$/,
     exclude: /(node_modules|bower_components)/,
     use: {
      loader: 'babel-loader',
      options: {
        //刚刚下载的module之一
       presets: ['babel-preset-env']
      }
     }
    }
   ]
 }
};

//遍历你的自定义要排除的依赖,安装到node_modules里的依赖一般不需要排除掉
deps.forEach(function (dep) {
  var depPath = path.resolve(node_modules, dep);
  config.resolve.alias[dep.split(path.sep)[0]] = depPath;
  config.module.noParse.push(depPath);
 });

module.exports = config;

以上代码可以直接用,请先将注释去掉。有了以上文件配置,你可以直接在package.json中添加scripts来打包你的app.js。

...
"scripts": {
  ...
  "build-config": "webpack",
  ...
}
...

执行npm run build-config可执行打包操作,但是目前为止还是会报错,因为缺少babel设置,webpack打包时无法识别jsx语法,什么时jsx语法?就是在js代码中写的类似于dom结构的东西,如下:

...
<h1 onClick={this.handleClick.bind(this)} style={{ color: "red" }}>
  {'Hello ' + this.state.text}
</h1>
...

要解析这个东西还需要添加.babelrc文件,在其中添加:

{
  "plugins": ["transform-react-jsx"]
}

这句主要是说在babel参与打包时,会启用jsx转换成js的插件。到这里你已经可以成功打出你想要的bundle.js

> webpack

Hash: e716d360a6a752006c09
Version: webpack 4.16.5
Time: 973ms
Built at: 2018-08-14 15:19:14
  Asset   Size Chunks       Chunk Names
bundle.js 715 KiB  main [emitted] main
Entrypoint main = bundle.js
[./react/app.js] 2.74 KiB {main} [built]
  + 21 hidden modules

webpack打包的好处就是这里,可以让你的app加载速度更快,如上的包总计715kb,隐藏了没有用到的模块21个。这就是为什么要搭手脚架开发的理由。

jsx-transform的坑

此外还有一点要说一下,就是在引入React时,请整个引入,要么就额外引入它在编译后的代码中可能会用到的api,否则会说什么什么没找到而导致页面加载不出来。看编译后的代码:

var _react = __webpack_require__(/*! react */ "./node_modules/react/index.js");
var _react2 = _interopRequireDefault(_react);
...
_createClass(MyTitle, [{
key: "handleClick",
value: function handleClick() {
  this.setState({
  text: "Clicked"
  });
}
}, {
key: "render",
value: function render() {
  return _react2.default.createElement(
  "h1",
  { onClick: this.handleClick.bind(this), style: { color: "red" } },
  'Hello ' + this.state.text
  );
}
}]);

如果你不引入react, 编译后render()函数中的_react2会是React.createElement而React显然是找不到这个变量的。看到编译后的代码,你可能更能理解,哦在jsx的dom中那样写原来是这个意思啊···

Vscode中开发,需要配置好eslint

react中有大量的es6的写法,如果不配置eslint你会看到大量飘红,首先是在项目的开发环境安装依赖:

"devDependencies": {
  ···
  "eslint": "^5.3.0",
  "eslint-plugin-import": "^2.14.0"
  ···
}

在项目根路径下添加.eslintrc.json,并添加以下代码[^eslint]:

{
 "parserOptions": {
   //使用的ecma版本
  "ecmaVersion": 6,
  "sourceType": "module",
  //使用jsx特性
  "ecmaFeatures": {
   "jsx": true
  }
 },
 "rules": {
   //忽略console的警告
  "no-console": "off",
  "semi": ["error", "always"]
 }
}

参考:

  • eslint官方文档
  • babel-plugin-transform-jsx文档
  • webpack4.15.1 官方文档
  • babelrc 配置文档
  • React+Webpack快速上手指南(虽然已经过时,还有部分不适用,但是还是借鉴了一部分代码)
  • 阮一峰 四课时培训课,虽然过时,但是还是能带你体验一番前端开发

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

Javascript 相关文章推荐
大家未必知道的Js技巧收藏
Apr 07 Javascript
jquery自动将form表单封装成json的具体实现
Mar 17 Javascript
Shell脚本实现Linux系统和进程资源监控
Mar 05 Javascript
JavaScript中length属性的使用方法
Jun 05 Javascript
JQuery节点元素属性操作方法
Jun 11 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
Aug 08 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
Sep 01 Javascript
JavaScript实现水平进度条拖拽效果
Jan 18 Javascript
webpack4 SCSS提取和懒加载的示例
Sep 03 Javascript
layui表格数据重载
Jul 27 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
Oct 15 Javascript
JS实现普通轮播图特效
Jan 01 Javascript
React+Webpack快速上手指南(小结)
Aug 15 #Javascript
layui从数据库中获取复选框的值并默认选中方法
Aug 15 #Javascript
关于微信小程序bug记录与解决方法
Aug 15 #Javascript
layui select获取自定义属性方法
Aug 15 #Javascript
Vue自定义toast组件的实例代码
Aug 15 #Javascript
JavaScript中set与get方法用法示例
Aug 15 #Javascript
基于JavaScript实现瀑布流布局
Aug 15 #Javascript
You might like
php中的时间显示
2007/01/18 PHP
php 购物车的例子
2009/05/04 PHP
比较全面的PHP数组的使用方法小结
2010/09/23 PHP
PHP实现根据银行卡号判断银行
2015/04/29 PHP
ThinkPHP实现附件上传功能
2017/04/27 PHP
php与js的区别是什么
2013/08/05 Javascript
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
2013/12/11 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
常用的javascript设计模式
2017/01/11 Javascript
微信小程序 scroll-view隐藏滚动条详解
2017/01/16 Javascript
JS控件bootstrap suggest plugin使用方法详解
2017/03/25 Javascript
js+html5生成自动排列对话框实例
2017/10/09 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
2018/04/18 Javascript
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
使用vue-router切换页面时实现设置过渡动画
2019/10/31 Javascript
jQuery实现轮播图效果demo
2020/01/11 jQuery
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
[02:28]DOTA2亚洲邀请赛 LGD战队巡礼
2015/02/03 DOTA
Python中Threading用法详解
2017/12/27 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
python matplotlib库绘制散点图例题解析
2019/08/10 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
Python类的动态绑定实现原理
2020/03/21 Python
Jupyter Notebook 实现正常显示中文和负号
2020/04/24 Python
使用CSS3编写类似iOS中的复选框及带开关的按钮
2016/04/11 HTML / CSS
CSS3 box-sizing属性详解
2016/11/15 HTML / CSS
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
2015/02/22 面试题
《赵州桥》教学反思
2014/02/17 职场文书
护士岗位竞聘书
2015/09/15 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
小程序后台PHP版本部署运行 LNMP+WNMP
2021/04/01 Servers