基于React+Webpack+Mobx+Less项目搭建指南

此教程针对 Webpack 为 4.X 版本

Webpack

版本是 4.6.0

Webpack 支持零配置,如果 entry 不配置,默认值为 ./src ;如果 output 不写,默认值为 ./distWebpack4.X 版本废弃了 CommonsChunkPlugin,需要使用 optimize.splitChunks 来替换。extract-text-webpack-plugin@4.0.0-beta.0 有很多问题,基于官方推荐,我们使用 mini-css-extract-plugin 来替换。

webpack.config.js 是不能使用 import 命令的,需要把文件名改成 webpack.config.babel.js 才可以。这是一个 webpack 支持的特性,只要你把文件名改成 webpack.config.[loader].js, webpack 就会用相应的 loader 去转换一遍配置文件。

新增了 mode 配置,有两个参数,一个为 production,另一个为 development

API:https://webpack.js.org/guides/getting-started/

Babel

Babel 主要是用来把代码转译为 ES5。使用前需要在 webpack.config.babel.js 配置 babel-loader,其次,在新增 .babelrc 文件,在该文件中进行配置一些转译规则。

在线转译的网址:http://babeljs.io/repl/

Mobx

Mobx 是一个简单、可扩展的状态管理库。

API:https://mobx.js.org/

Less

LessCSS 的语法基础之上,引入了变量,Mixin(混入),运算以及函数等功能,大大简化了 CSS 的编写,并且降低了 CSS 的维护成本,就像它的名称所说的那样,Less 可以让我们用更少的代码做更多的事情。

API: http://lesscss.org/

详细配置

新建 webpack.config.babel.js 文件,并作如下配置。

import path from 'path';
// 清除文件夹内文件插件
import CleanWebpackPlugin from 'clean-webpack-plugin';
// 生成 HTML 文件插件
import HtmlWebpackPlugin from 'html-webpack-plugin';
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
// 打开浏览器插件
import OpenBrowserPlugin from 'open-browser-webpack-plugin';
import alias from './webpack.alias.js';

const port = 9676;

module.exports = {
    // 入口文件
    entry: './src/index.js',
    // 输出
    output: {
        // 输出文件名
        filename: 'bundle.js',
        // 输出路径
        path: path.resolve(__dirname, 'dist')
    },
    // loader
    module: {
        rules: [{
            test: /\.js[x]?$/,
            loader: 'babel-loader',
            // node_modules 不使用 babel-loader
            exclude: /node_modules/
        }, {
            test: /\.less$/,
            use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader']
        }, {
            test: /\.css/,
            use: [MiniCssExtractPlugin.loader, 'css-loader']
        }]
    },
    resolve: {
        alias: alias,
        extensions: ['.js', '.jsx']
    },
    plugins: [
        new HtmlWebpackPlugin({
            title: 'Blog',
            template: path.join(__dirname, 'template.ejs')
        }),
        new MiniCssExtractPlugin({
            filename: '[name].css',
            allChunks: true
        }),
        new CleanWebpackPlugin('./dist/*.*'),
        new OpenBrowserPlugin({url: `http://localhost:${port}`})
    ],
    devServer: {
        // 端口号
        port: port,
        host: '0.0.0.0',
        compress: true,
        // 请求带 api 的自动转发到 8987 端口
        proxy: {
            '/api/*': {
                target: 'http://localhost:8987'
            }
        }
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
最后更新: 8/10/2019, 7:38:12 PM