重温 Webpack, Babel 和 React

开始之前

在书写文章之前,我假设大家已经有了 JavaScriptNode 包管理工具Linux 终端操作 这些基本技能,接下来,我将一步一步指引大家从头搭建一个 React 项目

最终实现的效果

我们将使用 WebpackBabel 搭建一个 React 应用,我们的目的很清晰,就是 更好的理解和掌握这些工具的使用

我们创建的应用程序既要做到 最小,也要遵循 最佳实践,为不是特别熟练的同学巩固一下基础

初始化

创建你的项目,并添加的你的配置文件 package.json


mkdir webpack-babel-react-revisited
cd webpack-babel-react-revisited

yarn init

Webpack

我们首先安装 Webpack,它是目前非常流行的 模块打包器,它将应用程序包含的每个模块打包成少量的 ,以便这些代码从服务器加载到浏览器中


yarn add webpack --dev

接下来,我们开始书写一些模块。我们将源文件 app.js 保存到 src 目录中


/** app.js */

console.log(‘Hello from 枫上雾棋!‘);

然后,我们跑一下 Webpack


./node_modules/webpack/bin/webpack.js ./src/app.js --output-filename ./dist/app.bundle.js

如果你打开生成的 app.bundle.js,你会发现上面是 webpack 的模块处理代码,下面是我们书写的 console.log

这条指令是将我们的 app.js 作为 Webpack入口文件,将结果输出到 dist 文件夹中,指令有些冗长,在实际开发中,我们使用 webpack 配置文件来代替,为了文档结构看起来更加清晰,参考 目录 如下


├── config
│   ├── paths.js
│   ├── webpack.config.prod.js
├── src
│   ├── app.js
├── package.json

下面是参考 配置

paths.js


const path = require(‘path‘);
const fs = require(‘fs‘);



const appDirectory = fs.realpathSync(process.cwd());
const resolveApp = relativePath => path.resolve(appDirectory, relativePath);

module.exports = {
appDist: resolveApp(‘dist‘),
appSrc: resolveApp(‘src‘),
};

<p>这个文件不是必须的,但在项目增大后,它的意义就瞬间出来了</p>
<p><code>webpack.config.prod.js</code></p>
<pre><code class="javascipt">const path = require(‘path‘);
const HtmlWebpackPlugin = require(‘html-webpack-plugin‘);

const paths = require(‘./paths‘);

const plugins = [
  new HtmlWebpackPlugin({
    title: ‘webpack babel react revisited‘,
    filename: path.join(paths.appDist, ‘index.html‘),
  }),
];

const config = {
  entry: {
    app: path.join(paths.appSrc, ‘app‘),
  },
  output: {
    path: paths.appDist,
    filename: ‘assets/js/[name].js‘,
  },
  resolve: {
    extensions: [‘.js‘, ‘.jsx‘],
  },
  plugins,
};

module.exports = config;

这里我们还添加了一个 html-webpack-plugin,它简化了我们 HTML 文件的创建,安装我们就不再这里赘述了,如果还不知道的同学可以点击链接查看

其中,我们还使用了一个 语法糖,这样在我们导入 .js.jsx 时就不需要指定扩展名了

接下来,我们指定配置文件再跑一下 Webpack


./node_modules/webpack/bin/webpack.js --config config/webpack.config.prod.js

发现除了实现上面的效果外,还自动帮我们生成了一个 index.html,我们可以点击这个 html,在控制台中查看效果,相比上面,是不是方便了很多

当然,最后我们肯定也不是使用这种方式来 build,打开 package.json,添加如下 脚本命令,然后执行 yarn build,是不是瞬间感觉 nice 了很多


"scripts": {
  "clean": "rimraf dist *.log .DS_Store",
  "build": "yarn run clean &amp;&amp; webpack --config config/webpack.config.prod.js --progress"
}

Webpack dev server

除此之外,Webpack 为我们提供了一个的 dev server,它还支持 模块热替换

首先,安装 webpack-dev-server


yarn add --dev webpack-dev-server

config 目录中添加配置文件 webpack.config.dev.js


const path = require(‘path‘);
const HtmlWebpackPlugin = require(‘html-webpack-plugin‘);
const OpenBrowserPlugin = require(‘open-browser-webpack-plugin‘);



const paths = require(‘./paths‘);

const hostname = process.env.HOST || ‘localhost‘;
const port = process.env.PORT || 3000;

const plugins = [
new HtmlWebpackPlugin({
title: ‘webpack babel react revisited‘,
filename: path.join(paths.appDist, ‘index.html‘),
}),
new OpenBrowserPlugin({ url: http://${hostname}:${port} }),];

const config = {
entry: {
app: path.join(paths.appSrc, ‘app‘),
},
output: {
path: paths.appDist,
filename: ‘assets/js/[name].js‘,
},
resolve: {
extensions: [‘.js‘, ‘.jsx‘],
},
plugins,
devServer: {
contentBase: paths.appDist,
compress: true,
port,
},
};

module.exports = config;

<p>在 <code>webpack.config.prod.js</code> 的基础上,我们增加了 <a href="https://github.com/baldore/open-browser-webpack-plugin" rel="nofollow noreferrer">open-browser-webpack-plugin</a> 插件和 <code>devServer</code> 配置,<code>open-browser-webpack-plugin</code> 插件顾名思义,会帮我们自动打开 <code>dev server</code> 最后返回给我们的地址</p>
<p>更新 <code>package.json</code></p>

"scripts": {

"clean": "rimraf dist *.log .DS_Store",

"webpack:dev":

"NODE_ENV=development webpack-dev-server --config config/webpack.config.dev.js --progress",

"webpack:prod":

"NODE_ENV=production webpack --config config/webpack.config.prod.js --progress",

"start": "yarn run clean && yarn run webpack:dev",

"build": "yarn run clean && yarn run webpack:prod"

}


<p>现在,我们就可以通过如下方式来启动</p>

yarn start


<p>启动后,有没有瞬间感觉很棒</p>
<h2>Babel</h2>
<p>为了能够使用 <code>ES6</code> 以及更高版本,我们需要一个 <code>转换编译器</code>,我们选择 <code>Babel</code>,它能将 <code>ES6</code> 转换成可以在浏览器中运行的代码,除此之外,他还内置了 <code>React JSX</code> 扩展,可以说它的出现推动了 <code>JavaScipt</code> 的发展</p>
<p>所有,我们安装下面这些依赖包</p>

yarn add --dev babel-loader babel-core babel-preset-env babel-preset-react


<p>创建 <code>Babel</code> 默认配置文件 <code>.babelrc</code></p>

{

"presets": ["env", "react"]

}


<p>这个是告诉 <code>Babel</code> 用我们刚刚安装的两个 <code>presets</code></p>
<p>接下来,更新 <code>webpack</code> 配置文件</p>
<pre><code class="javascipt">config.module = {
  rules: [
    {
      test: /\.(js|jsx)$/,
      exclude: /node_modules/,
      use: [‘babel-loader‘],
    },
  ],
}

更新以后,虽然看不到什么变化,但事实上我们可以使用 ES6

React

最后,我们来添加 React,这也可能是你阅读这篇文章的原因

首先,我们还是先安装它


yarn add react react-dom

用下面代码替换 console.log


import React, { Component } from ‘react‘;
import { render } from ‘react-dom‘;



export default class Hello extends Component {
render() {
return <h1>Hello from 枫上雾棋!</h1>;
}
}

render(<Hello />, document.getElementById(‘app‘));

<p>因为要添加 <code>&lt;div id="app"&gt;&lt;/div&gt;</code>,所以我们要修改一下 <code>html-webpack-plugin</code> 的配置</p>

new HtmlWebpackPlugin({

template: path.join(paths.appSrc, ‘index.html‘),

}),

```

参考 template 如下

&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"&gt; &lt;title&gt;webpack babel react revisited&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;noscript&gt; You need to enable JavaScript to run this app. &lt;/noscript&gt; &lt;div id="app"&gt;&lt;/div&gt; &lt;/body&gt; &lt;/html&gt;

接下来,就是见证奇迹的时刻

重新启动服务,你有没有发现搭建一个 React 应用程序就这么简单

接下来,大家就可以 自行探索,添加更多的东西来适应自身应用程序的需要

下面再补充一下如何添加 CSS图片

CSS

每个 web 应用程序都离不开 CSS,我们在 src 目录中创建 style.css


body,
html,
#app {
  margin: 0;
  width: 100%;
  height: 100%;
}

#app {
  padding: 30px;
  font-family: ‘微软雅黑‘;
}

将其添加到应用程序中我们需要使用 css-loader

如果想将 css 注入 style 标签中,我们还需要 style-loader,通常,是将这两个结合使用

我们使用 extract-text-webpack-plugin 将其解压到外部

为此,我们首先安装


yarn add --dev css-loader style-loader extract-text-webpack-plugin

然后在 app.js 中导入 style.css


import ‘./style.css‘;



<p>最后更新 <code>webpack</code> 配置文件</p>
<pre><code class="javascipt">config.module = {
  rules: [
    {
      test: /\.css$/,
      use: ExtractTextPlugin.extract({
        fallback: ‘style-loader‘,
        use: ‘css-loader‘,
      }),
    },
  ],
}

config.plugins.push([
  new ExtractTextPlugin("styles.css"),
])

看起来稍显复杂,但是大功告成,为了更好地使用它,我们都得经历这个过程

重新启动服务,你会发现你的 dist 目录中多了一个 styles.css

图片

最后我们增加 file-loader 来处理我们引入的图片等文件

首先,安装 file-loader


yarn add --dev file-loader

我们在 src/images 中放入一张图片,在 app.js 中导入


import avatar from ‘./images/avatar.jpg‘;



export default class Hello extends Component {
render() {
return (
<div>
<img src={avatar} alt="avatar" style={{ width: 400, height: 250 }} />
</div>
);
}
}

<p>更新 <code>webpack</code> 配置文件</p>
<pre><code class="javascipt">config.module = {
  rules: [
    {
      test: /\.(png|jpg|gif)$/,
      use: [
        {
          loader: ‘file-loader‘,
          options: {
            name: ‘[name].[ext]‘,
            outputPath: ‘assets/images/‘,
          },
        },
      ],
    },
  ],
}

重启服务,哈哈

总结

如果有什么问题,可以查看 webpack-babel-react-revisited 仓库

现在,大家对搭建 React 应用程序是不是感觉轻松了很多,但 React 整个技术栈并不止包括这些,还有 ReduxReact Router单元测试代码校验 等内容,关于 React 其他内容,欢迎查看日志其他文章

原文链接:Setting up Webpack, Babel and React from scratch, revisited

来源:https://segmentfault.com/a/1190000011565381

原文地址:https://www.cnblogs.com/lovellll/p/10162082.html

时间: 2024-11-13 10:51:36

重温 Webpack, Babel 和 React的相关文章

webpack+babel+ES6+react环境搭建

webpack+babel+ES6+react环境搭建 步骤: 1 创建项目结构 注意: 先创建一个项目目录  react  这个名字自定义,然后进入到这个目录下面 mkdir app //创建app目录 用来存放项目源文件 mkdir dist // 创建dist目录 用来存放打包好的文件 touch .gitignore //创建.gitignore 用来添加git 忽略的文件 touch webpack.config.js //创建webpack的配置文件 cd app //进入到app目

详解 Webpack+Babel+React 开发环境的搭建

1.认识Webpack 构建应用前我们先来了解一下Webpack, Webpack是一个模块打包工具,能够把各种文件(例如:ReactJS.Babel.Coffeescript.Less/Sass等)作为模块进行编译后进行打包. 2.安装Webpack 要开始使用Webpack在项目中进行开发前我们首先需要在全局环境中进行安装. npm install webpack -g 3.创建一个项目 安装好后创建一个名叫 learn-webpack 的项目并进入该项目文件夹,当然项目名字你可以起你自己想

使用webpack+babel构建ES6语法运行环境

1.前言 由于ES6语法在各个浏览器上支持的情况各不相同,有的浏览器对ES6语法支持度较高,而有的浏览器支持较低,所以为了能够兼容大多数浏览器,我们在使用ES6语法时需要使用babel编译器将代码中的ES6语法编译为ES5语法,下面就开始搭建一个基于webpack+babel的ES6语法运行环境. 2.需要安装的包 搭建环境之前我们需要安装以下JS包: webpack(安装webpack,必装) babel-loader和babel-core(babel转码器,必装) babel-preset-

基于 Webpack 4 和 React hooks 搭建项目

面对日新月异的前端,我表示快学不动了??. Webpack 老早就已经更新到了 V4.x,前段时间 React 又推出了 hooks API.刚好春节在家里休假,时间比较空闲,还是赶紧把 React 技术栈这块补上. 网上有很多介绍 hooks 知识点的文章,但都比较零碎,基本只能写一些小 Demo .还没有比较系统的,全新的基于 hooks 进行搭建实际项目的讲解.所以这里就从开发实际项目的角度,搭建起单页面 Web App 项目的基本脚手架,并基于 hooks API 实现一个 react

VScode(二):ES6 &amp; Nodejs &amp; webpack &amp; babel

目录 前言 1 VScode配置安装 2 Nodejs配置安装 3 VScode调试ES6 3.1 扩展插件安装 3.1.1 VScode插件 3.1.2 npm插件 3.2 环境配置 3.2.1 配置package.json 3.2.2 配置webpack.config.js 3.2.3 配置index.js和index.html 3.2.4 项目打包 4 项目执行 4.1 依赖安装 4.2 项目运行 4.2.1 webpack项目打包 4.2.2 webpack-dev-server热加载

[Webpack 2] Optimize React size and performance with Webpack production plugins

You can fine tune several webpack plugins to make your bundle as small as it can be for your specific application. However there are a few things you can do for pretty much every application to make it smaller and run faster. In this lesson we’ll com

Webpack Dev Server + React Hot Loader

1.安装 npm install webpack-dev-server react-hot-loader --save-dev 2.配置server.js var webpack = require('webpack'); var WebpackDevServer = require('webpack-dev-server'); var config = require('./webpack.config'); new WebpackDevServer(webpack(config), { pu

webpack babel 相关文章

https://github.com/ruanyf/webpack-demos https://segmentfault.com/a/1190000002490637 http://webpack.github.io/ https://github.com/thejameskyle/babel-handbook/blob/master/translations/zh-Hans/README.md

重温webpack(三)---管理输出

1.输出多个 bundle dist/index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Output Management</title> </head> <body> <script type="text/javascript" src="app.bundle.j