博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Webpack 4.x搭建react开发环境
阅读量:7126 次
发布时间:2019-06-28

本文共 3356 字,大约阅读时间需要 11 分钟。

必要依赖一览(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结构的东西,如下:

...

{
'Hello ' + this.state.text}

...复制代码

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

{    "plugins": ["transform-react-jsx"]}复制代码

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

> webpackHash: e716d360a6a752006c09Version: webpack 4.16.5Time: 973msBuilt at: 2018-08-14 15:19:14    Asset     Size  Chunks             Chunk Namesbundle.js  715 KiB    main  [emitted]  mainEntrypoint 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"]  }}复制代码

参考:

转载地址:http://xieel.baihongyu.com/

你可能感兴趣的文章
js中的hasOwnProperty()和isPrototypeOf()
查看>>
assign,copy,retain -Object-C中纠结的属性(转)
查看>>
发布系统之发布流程和发布salt相关命令
查看>>
从加载的XML文档重建工作流
查看>>
python基础知识~list详解
查看>>
jQuery对象和DOM对象的互换
查看>>
项目包进行分层
查看>>
linux 一些命令
查看>>
poj 3909
查看>>
redis之 3.0集群安装
查看>>
Java类加载机制
查看>>
Angular.js+Bootstrap实现手风琴菜单
查看>>
Android SDK开发包国内下载地址
查看>>
windows环境下SVN服务器限制注释字数
查看>>
2018-2019-1 20165318 20165326 实验五 通讯协议设计
查看>>
C#面向对象课程 类与对象,方法重载,类的静态成员,命名空间和类库12月22日...
查看>>
抽象工厂模式
查看>>
控件移动
查看>>
php mongodb driver : mongodb 笔记
查看>>
获取一篇新闻的全部信息
查看>>