实践webpack+es6+react+redux+antd构建项目(一) webpack配置

释放双眼,带上耳机,听听看~!

        在网上看到过很多教程,都是从零开始构建一个项目,每次看着都浩浩荡荡的开始跟着博客一步一步走,但是总是很难成功。自己一直想要从零构建一个项目来实践一下,了解一下偏底层的配置。最近比较有时间,就又一次开始了。不过这次没有盲目的在网上找教程,而是直接打开官方文档webpack,开始实践。

       所以给大家的建议也是 **学习就直接看官方文档就行,遇到问题再搜索,**整那些有的没的,其实很浪费时间和精力。特别是学习配置这些知识,以官方文档,基本是没有错的。

写在前面: 我尽量是按官方文档的构建流程写的,加上了遇到的问题,如果你参考完但是并没有成功构建,建议你还是去看官网,遇到问题自己google,其实都是可以解决的。加油

1、开始安装

首先创建一个目录,就是你项目的名称,然后在本地安装webpack环境


1
2
3
4
1mkdir project-test && project-test
2npm init -y
3npm install webpack webpack-cli --save-dev
4

–save-dev 表示在本地的dev环境中安装依赖

 然后使用编辑器打开,创建这几个文件

在根目录创建 webpack.config.js,用于webpack配置。创建src/index.js,入口文件;dist/index.html,出口文件。

如下所示:

实践webpack+es6+react+redux+antd构建项目(一) webpack配置

2、基本配置

首先了解webpack是干什么用的。

它是一个基于Node的模块打包器,js,css,less等都算是模块,它会识别这些模块然后将其打包成为合适的格式以供浏览器使用。也就是说通过入口文件找到各个模块,使用loader(加载器)进行处理,然后打包成为一个浏览器可识别的js文件(一般就是dist/dundle.js)

先来说简单的入口,出口配置


1
2
3
4
5
6
7
8
9
10
1const path = require('path');
2
3module.exports = {
4    entry: './src/index.js',
5    output: {
6        filename: 'bundle.js',
7        path: path.resolve(__dirname, 'dist')
8    }
9}
10

执行webpack命令不是很方便,于是采取 npm 脚本的方式运行,在package.json配置如下:


1
2
3
4
5
1"scripts": {
2    "test": "echo \"Error: no test specified\" && exit 1",
3    "start": "webpack"
4  },
5

 之后可以直接  npm run start  来运行项目。

目前为止只是配置了webpack的出入口打包配置。但是文件中都没有写内容,所以也看不到项目启动的页面。

所以来写一点东西看看吧。

src/index.js


1
2
3
4
5
6
7
8
9
10
1  function component() {
2    var element = document.createElement('div');
3    
4    element.innerHTML = 'hello';
5  
6    return element;
7  }
8  
9  document.body.appendChild(component());
10

dist/index.html


1
2
3
4
5
6
7
8
9
10
1<!doctype html>
2<html>
3  <head>
4    <title>project-test</title>
5  </head>
6  <body>
7      <script src="bundle.js"></script>
8  </body>
9</html>
10

 运行 npm run start ,此时是没有devServer的,所以不能通过服务看到页面,需要手动打开 dist/index.html页面,就可以看到页面的正常显示。

3、配置devServer

最想要的还是可以直接启动项目,在代码发生变化后自动编译代码,而不是手动打开,所以就要配置个server来实现,先说简单的server配置,关于热重载的东西稍后再说.

webpack-dev-server 提供了一个简单的服务器,可以实时重新加载


1
2
1npm install --save-dev webpack-dev-server
2

在webpack.config.js中配置如下:


1
2
3
4
5
6
7
8
9
1   devServer: {
2        // 默认 localhost
3        host: 'localhost',
4        port: 9000,
5        // 实现实时更新,
6        // 告诉dev server 在哪里查找文件
7        contentBase: './dist'
8    }
9

在package.json中修改start配置


1
2
3
4
5
1  "scripts": {
2    "test": "echo \"Error: no test specified\" && exit 1",
3    "start": "webpack-dev-server --open"
4  },
5

 然后 npm run start 就可以看到在devServer服务上启动的项目了。可以实现自动刷新,你修改src/index.js文件,可以实时反应在页面上。

接下来是webpack项的其余配置,用于项目更好的运行和调试。

3.1使用source map


1
2
3
1// 编译后映射到源代码,方便错误调试
2    devtool: 'inline-source-map',
3

3.2设定HtmlWebpackPlugin


1
2
1npm install --save-dev html-webpack-plugin
2

 这个就是关于在dist/index.html文件中引入js文件的,因为往往手动引入一个bundle.js是不能满足需求的。

虽然在 dist/ 文件夹我们已经有 index.html 这个文件,然而 HtmlWebpackPlugin 还是会默认生成 index.html 文件。这就是说,它会用新生成的 index.html 文件,把我们的原来的替换

也就是说它会替换index.html,但是你又不能不写。

在webpack.config.js中配置


1
2
1const HtmlWebpackPlugin = require('html-webpack-plugin');
2

 module.exports 中添加


1
2
3
4
5
6
1   plugins: [
2     new HtmlWebpackPlugin({
3       title: 'project-test'
4     })
5   ],
6

3.3 清理/dist文件夹 


1
2
1npm install clean-webpack-plugin --save-dev
2

 用于清理dist中冗余的文件


1
2
1 const CleanWebpackPlugin = require('clean-webpack-plugin');
2

1
2
3
4
5
6
7
1   plugins: [
2     new CleanWebpackPlugin(['dist']),
3      new HtmlWebpackPlugin({
4        title: 'project-test'
5      })
6    ],
7

 但是我在实践的时候遇到了dist文件夹直接就被删除了的问题,所以初次构建的同学可以忽略此项。

4、引入各种依赖

主要的配置就是webpack依赖项,所以就是不断的安装依赖,并正确的使用这些依赖。

4.1  引入css/less


1
2
1npm install --save-dev style-loader css-loader
2

1
2
1npm install --save-dev less less-loader
2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1    // webpack 自身只能理解js,引入loader可以将所有类型的文件转换为webpack可以识别的有效模块。
2    // loader有两个目标,
3    //  test 用于标识出应该被对应的 loader 进行转换的某个或某些文件
4    //  use 表示进行转换时,应该使用哪个 loader。  
5    module: {
6        rules: [
7            {
8                test: /\.css$/,
9                use: [
10                    'style-loader',
11                    'css-loader'
12                ]
13            },
14            {
15                test: /\.less$/,
16                use: [
17                    'style-loader',
18                    'css-loader',
19                    'less-loader'
20                ]
21            }
22        ]
23    }
24

有人肯定就会疑问了,css和less有这么多重复的配置,为什么不写在一起呢?诶,是个好问题,我有尝试写在一起,但是总是加载不成功,但确实是可以写在一起的,想法没有问题,之后有时间实践一下。

4.2 加载图片/字体


1
2
1npm install --save-dev file-loader
2

在rules中添加 


1
2
3
4
5
6
7
8
9
10
11
12
13
1{
2     test: /\.(png|svg|jpg|gif)$/,
3     use: [
4         'file-loader'
5     ]
6},
7{
8     test: /\.(woff|woff2|eot|ttf|otf)$/,
9     use: [
10          'file-loader'
11     ]
12}
13

现在一起来尝试一下这些依赖。

在src文件中添加一个index.less


1
2
3
4
1.changeColor {
2    color: red;
3}
4

在index.js中引入


1
2
3
4
5
6
7
8
9
10
11
12
13
1  import './index.less'
2
3  function component() {
4    var element = document.createElement('div');
5
6    element.innerHTML = 'hedfsdddfdssdsllo';
7    element.classList.add('changeColor');
8  
9    return element;
10  }
11  
12  document.body.appendChild(component());
13

可以看到页面上的字体是红色的了。

4.3 模块热替换配置

允许在运行时更新各种模块,而无需进行完全刷新


1
2
3
4
5
6
7
8
9
10
11
1const webpack = require('webpack');
2
3devServer: {
4    ...
5    hot: true
6},
7plugins: [
8    ...
9    new webpack.HotModuleReplacementPlugin()
10]
11

具体有什么用,其实我目前也没有太搞明白。

4.4 环境区分


1
2
3
1// 启用相应模式(development,production)下的webpack内置的优化
2 mode: 'development'
3

1
2
3
4
5
6
7
8
1/**
2 * 开发环境(development)和生产环境(production)的构建目标差异很大。
3 * 在开发环境中,我们需要具有强大的、具有实时重新加载(live reloading)
4 * 或热模块替换(hot module replacement)能力的 source map 和 localhost server。
5 * 而在生产环境中,我们的目标则转向于关注更小的 bundle,更轻量的 source map,以及更优化的资源,以改善加载时间。
6 * 由于要遵循逻辑分离,我们通常建议为每个环境编写彼此独立的 webpack 配置。
7 */
8

所以建议是区分开发环境和生产环境


1
2
1npm install --save-dev webpack-merge
2

但是这里我还并没有搞得太清楚,就之后再议吧。

对于webpack构建基本项目就到这里!有什么疑问的地方都可以留言。

之后系列将引入react,redux,es6,antd等,逐渐构建一个完整的前端项目。

github:WERRA

链接: 实践webpack+es6+react+redux+antd构建项目(二) react,redux,antd引入

实践webpack+es6+react+redux+antd构建项目(三) 配置proxy代理 

实践webpack+es6+react+redux+antd构建项目(四) 区分dev和prod环境

项目github地址

关注我获取更多前端资源和经验分享

实践webpack+es6+react+redux+antd构建项目(一) webpack配置

 

感谢大佬们阅读,希望大家头发浓密,睡眠良好,情绪稳定,早日实现财富自由~

 

给TA打赏
共{{data.count}}人
人已打赏
安全技术

OpenSSL之Blowfish对称加密

2021-8-18 16:36:11

安全技术

C++ 高性能服务器网络框架设计细节

2022-1-11 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索