webpack 快速构建 React 学习环境(1)

简介: 本人对脚手架有点儿抵触(可能主要是对未知的恐惧),从开始学习 React 就走了自己搭建开发环境的路线,这里总结下搭建过程,希望能帮助和我一样不愿使用脚手架工具,但又急需一个练习环境的初学者。

React 官方有一套脚手架工具,是初学者的最好选择,可以让初学者集中注意力在 React 本身。

本人对脚手架有点儿抵触(可能主要是对未知的恐惧),从开始学习 React 就走了自己搭建开发环境的路线,这里总结下搭建过程,希望能帮助和我一样不愿使用脚手架工具,但又急需一个练习环境的初学者。

文章同步发布在个人博客站点

本节目标

基于 webpack 构建一个最小 React 项目开发环境,以把下面的 React 组件成功渲染在页面上为目标,即显示 Hello React 到页面。

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

export default class HelloReact extends React.Component{
  constructor(props) {
    super(props);
  }

  render(){
    return( <div>Hello React</div>);
  }
}

ReactDOM.render(<HelloReact />, document.getElementById('root'));
复制代码

创建项目目录:

mkdir react-demo
cd react-demo
复制代码

初始化 npm 环境:

npm init  //这里基本一路回车即可;需要你的系统安装有 node。我安装的 node: v8.2.1、npm: 5.3.0。
复制代码

完成后会在项目根目录下生成 package.json 文件:

{
  "name": "react-demo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "wewin",
  "license": "ISC"
}
复制代码

package.json 文件的作用是记录各个软件的依赖关系,类似 Rails 中的 Gemfile

基本依赖安装

React 项目依赖的软件包 react、react-dom 是必须的。因为目标是要构建使用 webpack 打包的开发环境,webpack、webpack-cli 不能少。

npm i react -D
npm i react-dom -D
npm i webpack -D
npm i webpack-cli -D
复制代码

此时项目结构如下:

react-demo tree -L 1 .
.
├── node_modules  // npm 包的安装目录
├── package-lock.json
└── package.json

1 directory, 2 files
复制代码

node_modules 是依赖包的安装目录,package-lock.json 是依赖包版本锁定。可以保证多个环境或者多个协作者开发环境中依赖包版本一致性。

此时 package.json 内容如下

{
  "name": "react-demo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "wewin",
  "license": "ISC",
  "devDependencies": {
    "react": "^16.4.1",
    "react-dom": "^16.4.1",
    "webpack": "^4.12.2",
    "webpack-cli": "^3.0.8"
  }
}
复制代码

创建项目基本结构

首先创建 src、build 两个目录

  react-demo tree . -L 1
.
├── build  // React 打包的出口, webpack 下默认打包在 dist 目录下,个人习惯放在 build 下
├── node_modules
├── package-lock.json
├── package.json
└── src // 源码文件,后面开发基本在这个目录下完成
复制代码

在 src 目录下创建 webpack 打包的入口文件

cd src
touch index.js
复制代码

创建 webpack 配置文件

使用 webpack 打包需要创建一个 webpack 配置文件, webpack4 很多配置项都有了默认值,这里是我自己的一个简单配置。

1、最基本的打包入口、出口的配置 (webpack4 入口、出口有默认配置)

const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'build'),  // 打包出口,即打包后的文件会放在这个目录下
    filename: '[name].[hash:8].js'   // 打包后的文件名
    publicPath: './', 	// 静态资源相对路径
  }
};
复制代码

2、使用 html-webpack-plugin 插件自动生成文件 html 文件,并插入 <script> 标签的特性。 [html-webpack-plugin] (https://github.com/jantimon/html-webpack-plugin#options) 插件很智能,可以根据你的配置生成你想要的 html。

安装和配置这个插件:

npm i html-webpack-plugin -D
复制代码

webpack.config.js:

const path = require('path');
var HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'build'),
    filename: '[name][hash:8].js',
    publicPath: './',
  },
  plugins: [new HtmlWebpackPlugin({
	filename: 'index.html',   // 指定生成的文件名,默认就是 index.html
    	template: 'src/index.html'  // 指定 html 生成使用用的模版文件,我指定 使用 ```src/index.html``` 作为模版文件
  })]
};
复制代码

模版文件 src/index.html, 内容如下:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Hello React</title>
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>
复制代码

第一个 React 应用。

就是开头提到的在页面上显示 'Hello React' 的小应用。

src/index.js:

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

export default class HelloReact extends React.Component{
  constructor(props) {
    super(props);
  }

  render(){
    return( <div>Hello React</div>);
  }
}

ReactDOM.render(<HelloReact />, document.getElementById('root'));
复制代码

编译 React 应用

./node_modules/.bin/webpack 
复制代码

报错如下:

WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
复制代码

这是需要加 'mode' 参数,加参数后运行:

./node_modules/.bin/webpack --mode=development
复制代码

报错:

ERROR in ./src/index.js 1:18
Module parse failed: Unexpected token (1:18)
You may need an appropriate loader to handle this file type.
> import React from react;
| import ReactDOM from react-dom;
复制代码

这是因为 react 使用的 es6 语法需要使用: babel-loader 来翻译 es6 及最新的 js 语法

安装 babel loader

npm i "babel-loader@^8.0.0-beta" @babel/core @babel/preset-env -D
复制代码

webpack.config.js 配置:

const path = require('path');
var HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'build'),
    filename: '[name].[hash:8].js',
    publicPath: './',
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /(node_modules)/,
        use: {
          loader: 'babel-loader'
        },
      },
    ],
  },
  plugins: [new HtmlWebpackPlugin()]
};
复制代码

在项目根目录下创建 babel 的配置文件 .babelrc:

{
  "presets": [
    ["@babel/preset-env", {
      "targets": {
        "node": "current"
      }
    }]
  ]
}
复制代码
./node_modules/.bin/webpack --mode=development
复制代码

继续报错:

ERROR in ./src/index.js
Module build failed (from ./node_modules/babel-loader/lib/index.js):
SyntaxError: /Users/wewin/reactLearn/react-demo/src/index.js: Unexpected token (10:12)

   8 |
   9 |   render(){
> 10 |     return( <div>Hello React</div>);
     |             ^
  11 |   }
  12 | }
  13 |
复制代码

这是因为 babel 需要配置 react preset 来支持 react 语法解析。

安装 @babel/preset-react :

npm i @babel/preset-react -D
复制代码

修改 babel 配置文件 .babelrc:

{
  "presets": [
    ["@babel/preset-env", {
      "targets": {
        "node": "current"
      }
    }],
    "@babel/preset-react"
  ]
}
复制代码

再次编译

./node_modules/.bin/webpack --mode=development
复制代码

congratulations! 成功编译:

Hash: e09b122cfb00f2a585f8
Version: webpack 4.12.2
Time: 898ms
Built at: 2018-06-29 08:19:29
           Asset       Size  Chunks             Chunk Names
main.e09b122c.js    713 KiB    main  [emitted]  main
      index.html  200 bytes          [emitted]
[./src/index.js] 648 bytes {main} [built]
    + 21 hidden modules
Child html-webpack-plugin for "index.html":
     1 asset
    [./node_modules/html-webpack-plugin/lib/loader.js!./src/index.html] 337 bytes {0} [built]
    [./node_modules/webpack/buildin/global.js] (webpack)/buildin/global.js 489 bytes {0} [built]
    [./node_modules/webpack/buildin/module.js] (webpack)/buildin/module.js 497 bytes {0} [built]
复制代码

编译成功后在 build 目录下生成了 index.html 和打包后的 js 文件 main.e09b122c.js,index 文件就是 html-webpack-plugin 插件生成的,会自动插入生成的 js 文件。

build/index.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Hello React</title>
  </head>
  <body>
    <div id="root"></div>
    <script type="text/javascript" src="./main.e09b122c.js"></script>
  </body>
</html>
复制代码

用浏览器打开 build/index.html 文件,就可以看到 Hello React 正常输出。

总结

本篇主要目的是总结如何搭建一个最小 React 项目的开发环境,适合抵触脚手架工具,但是又需要一个 React 练习环境的初学者。对 webpack 及相关插件的相关东西基本一笔就带过了。这个作为开发还不够智能,如不能热加载,每次对代码有修改就要重新编译,重新刷新页面,简直毫无开发体验可言,这些,请参考第二篇: webpack 快速构建 React 学习环境(2)-- 热更新




原文发布时间为:2018年06月29日

作者:蚂蚁哈哈哈

本文来源: 掘金  如需转载请联系原作者
相关文章
|
4月前
|
存储 缓存 前端开发
利用 Webpack 5 的持久化缓存来提高构建效率
【10月更文挑战第23天】利用 Webpack 5 的持久化缓存是提高构建效率的有效手段。通过合理的配置和管理,我们可以充分发挥缓存的优势,为项目的构建和开发带来更大的便利和效率提升。你可以根据项目的实际情况,结合以上步骤和方法,进一步优化和完善利用持久化缓存的策略,以达到最佳的构建效果。同时,不断探索和实践新的方法和技术,以适应不断变化的前端开发环境和需求。
|
4月前
|
缓存 监控
webpack 提高构建速度的方式
【10月更文挑战第23天】需要根据项目的具体情况和需求,综合运用这些方法,不断进行优化和改进,以达到最佳的构建速度和效果。同时,随着项目的发展和变化,还需要持续关注和调整构建速度的相关措施,以适应不断变化的需求。
|
4月前
|
前端开发 JavaScript
手敲Webpack 5:React + TypeScript项目脚手架搭建实践
手敲Webpack 5:React + TypeScript项目脚手架搭建实践
|
5月前
|
JavaScript
webpack学习五:webpack的配置文件webpack.config.js分离,分离成开发环境配置文件和生产环境配置文件
这篇文章介绍了如何将webpack的配置文件分离成开发环境和生产环境的配置文件,以提高打包效率。
90 1
webpack学习五:webpack的配置文件webpack.config.js分离,分离成开发环境配置文件和生产环境配置文件
|
5月前
|
移动开发 JavaScript 前端开发
webpack学习四:使用webpack配置plugin,来使用HtmlWebpackPlugin、uglifyjs-webpack-plugin、webpack-dev-server等插件简化开发
这篇文章主要介绍了如何通过配置Webpack的插件,如HtmlWebpackPlugin、uglifyjs-webpack-plugin和webpack-dev-server,来简化前端开发流程。
157 0
webpack学习四:使用webpack配置plugin,来使用HtmlWebpackPlugin、uglifyjs-webpack-plugin、webpack-dev-server等插件简化开发
|
5月前
|
JavaScript
webpack学习三:webpack初始化整合配置vue,一步一步的抽离代码块整合vue。
这篇文章是关于如何在webpack环境中配置Vue.js,包括安装Vue.js、解决报错、理解el与template的区别、使用SPA模式、抽离模板为对象、封装为单独的js文件、安装vue-loader时遇到的问题及解决方案,以及整个过程的总结。
144 2
webpack学习三:webpack初始化整合配置vue,一步一步的抽离代码块整合vue。
|
5月前
|
JavaScript 前端开发 Java
webpack学习一:什么是模块化开发,什么是webpack,以及二者之间的关系。
这篇文章介绍了模块化开发的概念、历史和实现方式,以及webpack作为一个现代JavaScript应用的静态模块打包工具,它如何帮助我们将ES6等高级语法打包成浏览器可以识别的低级语法,并解释了npm在webpack安装和使用中的作用。
58 1
webpack学习一:什么是模块化开发,什么是webpack,以及二者之间的关系。
|
6月前
|
JavaScript 测试技术 Windows
vue配置webpack生产环境.env.production、测试环境.env.development(配置不同环境的打包访问地址)
本文介绍了如何使用vue-cli和webpack为Vue项目配置不同的生产和测试环境,包括修改`package.json`脚本、使用`cross-env`处理环境变量、创建不同环境的`.env`文件,并在`webpack.prod.conf.js`中使用`DefinePlugin`来应用这些环境变量。
464 2
vue配置webpack生产环境.env.production、测试环境.env.development(配置不同环境的打包访问地址)
|
7月前
|
JavaScript 前端开发 API
解锁前端开发新境界:Vue.js携手Webpack,打造高效构建流程,你的项目值得拥有!
【8月更文挑战第30天】随着前端技术的发展,模块化与组件化趋势愈发显著。Vue.js 以其简洁的 API 和灵活的组件系统,深受开发者喜爱;Webpack 则凭借强大的模块打包能力成为前端工程化的基石。两者结合,不仅简化了组件编写与引用,还通过模块热替换、代码分割等功能大幅提升开发效率。本文将通过具体示例,展示如何利用 Vue.js 和 Webpack 构建高效、有序的前端开发环境。从安装配置到实际应用,逐步解析这一组合的优势所在。
73 0
|
7月前
|
前端开发 JavaScript C++
【绝技大公开】Webpack VS Rollup:一场前端工程化领域的巅峰对决,谁能笑到最后?——揭秘两大构建神器背后的秘密与奇迹!
【8月更文挑战第12天】随着前端技术的发展,模块化与自动化构建成为标准实践。Webpack与Rollup作为主流构建工具,各具特色。Webpack是一款全能型打包器,能处理多种静态资源,配置灵活,适合复杂项目;Rollup专注于ES6模块打包,利用Tree Shaking技术减少冗余,生成更精简的代码。Rollup构建速度快,配置简洁,而Webpack则拥有更丰富的插件生态系统。选择合适的工具需根据项目需求和个人偏好决定。两者都能有效提升前端工程化水平,助力高质量应用开发。
67 1