学习React,你必须知道的Webpack配置!

学习react,就要配套去学Webpack。初始并不明白Webpack是什么,是干什么的。后来对比之前Angular的项目,才明白,Webpack干的活跟gulp是一样的。从网上搜到了一个国外的大神写的blog,跟着一步一步配置,受益颇多。我按照自己的理解,做了简单的整理。

  1. 将多个HTML文件,整合为一个HTML文件,并压缩
  2. 优化图片
  3. 将Sass编译为CSS并压缩
  4. 结合Babel编译JS文件,并压缩
  5. 监听文件变化并在保存时重新编译,刷新页面(通过Webpack Dev Server)

首先,我们要新建一个文件夹,进行项目初始化,做一些简单的配置。

mkdir webpack-demo
然后,在项目文件夹中,创建一些必要的文件夹: js,img,_scss。

通过指令初始化 package.json ,安装webpack

  1. npm init -y
  2. npm i webpack --save-dev
在初始化的 package.json 中添加指令:

"scripts": {
  "build": "webpack",
  "watch": "webpack --watch"
}
准备工作结束!

1.将多个HTML文件,整合为一个HTML文件,并压缩

与gulp不同,webpack是专门针对JavaScript的,所以它根本不知道怎么处理其他格式的文件。

这时,就需要loaders了。可以把loaders理解为是“转换器”。

下载HTML的loaders:

npm i html-webpack-plugin html-loader --save-dev
安装的同时,就在根目录下创建一个配置文件 webpack.config.js 。这个文件相当重要,因为当运行webpack项目的时候,

会自动去找一个配置文件,就是这个文件。

初始化会有一些基础的配置:

const HtmlWebPackPlugin = require("html-webpack-plugin");
const path = require("path");

module.exports = {
  entry: ["./src/js/index.js"],// 重要
  output: {//重要
    filename: "js/index.js",
    path: path.join(__dirname, "./build/")
  },
  module: {
    rules: [// 规则这里,配置不同文件类型的loader
      {
        test: /\.html$/,
        use: [{ loader: "html-loader", options: { minimize: true } }]
      }
    ]
  },
  plugins: [
    new HtmlWebPackPlugin({
      template: "./src/index.html",
      filename: "./index.html"
    })
  ]
};
重点:

  1. entry: 指定项目入口js文件
  2. output: webpack打包后的js文件路径及名称
  3. module and rules: 配置不同文件格式loaders的地方
  4. plugins: 配置webpack需要依赖的插件的地方
做好以上的配置,就可以创建 ./src/index.html 文件

 

  1. <!DOCTYPE html>
  2. <html lang="it">

  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>Webpack</title>
  7. </head>

  8. <body>
  9. <section class="main">
  10. <h1>Hello Webpack!!</h1>
  11. </section>
  12. </body>

  13. </html>

创建 ./src/index.js文件:

  1. console.log(`I've been required by Webpack`);
然后控制台执行指令:

  1. npm run build
执行成功后,会发现项目根目录下多了一个 build 文件夹,以及压缩后的index.html , index,js文件

浏览器运行这个index.html,可以看到页面及控制台:

2.优化图片

添加依赖:

  1. npm i img-loader url-loader file-loader --save-dev
img-loader 优化图片的loader。

url-loader 是当图片在指定大小下会转换为一个Base64 URL

加载 Base64 URL的图片的好处在于:浏览器不用加载外部的图片。但是也有限制:太大的图片不能通过Base64 URL 的形式加载。

接下来,自己找两个图片,一个大点的(1.png)一个小点的(2.png),放到img文件夹里,引入index.html中:

  1. <!DOCTYPE html>
  2. <html lang="it">

  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>Webpack</title>
  7. </head>

  8. <body>
  9. <section class="main">
  10. <h1>Hello Webpack!!</h1>
  11. <img src="img/1.png">
  12. <img src="img/2.png">
  13. </section>
  14. </body>

  15. </html>
webpack.config.js 文件中更新下,增加图片的loader配置:

  1. const HtmlWebPackPlugin = require("html-webpack-plugin");
  2. const path = require("path");

  3. module.exports = {
  4. entry: ["./src/js/index.js"],
  5. output: {
  6. filename: "js/index.js",
  7. path: path.join(__dirname, "./build/")
  8. },
  9. module: {
  10. rules: [
  11. {
  12. test: /\.html$/,
  13. use: [{ loader: "html-loader", options: { minimize: true } }]
  14. },
  15. {// 新增的,对图片编译的配置
  16. test: /\.(png|jpe?g)/i,
  17. use: [
  18. {
  19. loader: "url-loader",
  20. options: {
  21. name: "./img/[name].[ext]",
  22. limit: 10000
  23. }
  24. },
  25. {
  26. loader: "img-loader"
  27. }
  28. ]
  29. }
  30. ]
  31. },
  32. plugins: [
  33. new HtmlWebPackPlugin({
  34. template: "./src/index.html",
  35. filename: "./index.html"
  36. })
  37. ]
  38. };
然后运行指令 npm run build,结束后刷新index.html页面,观察控制台,可以看到小图片2.png转为Base64 URL格式了。

3.将Sass编译为CSS并压缩

这个过程,除了css loader,还需要ExtractTextPlugin 插件

  1. npm i css-loader sass-loader postcss-loader node-sass extract-text-webpack-plugin --save-dev
webpack.config.js 更新,添加css loader 配置:

const HtmlWebPackPlugin = require("html-webpack-plugin");
const ExtractTextPlugin = require("extract-text-webpack-plugin"); //新加
const path = require("path");

module.exports = {
  entry: ["./src/js/index.js", "./src/_scss/main.scss"],
  output: {
    filename: "js/index.js",
    path: path.join(__dirname, "./build/")
  },
  module: {
    rules: [
      {
        test: /\.html$/,
        use: [{ loader: "html-loader", options: { minimize: true } }]
      },
      {
        test: /\.(png|jpe?g)/i,
        use: [
          {
            loader: "url-loader",
            options: {
              name: "./img/[name].[ext]",
              limit: 10000
            }
          },
          {
            loader: "img-loader"
          }
        ]
      },
      {//新加
        test: /\.scss$/,
        use: ExtractTextPlugin.extract({
          use: [
            {
              loader: "css-loader",
              options: { minimize: true }
            },
            { loader: "postcss-loader" },
            { loader: "sass-loader" }
          ]
        })
      }
    ]
  },
  plugins: [
    new HtmlWebPackPlugin({
      template: "./src/index.html",
      filename: "./index.html"
    }),
    new ExtractTextPlugin({//新加,知道编译后的文件路径及名称
      filename: "css/main.css"
    })
  ]
};
创建一个sass文件:./src/_scss/main.scss

  1. $color-orange: #f98a09;

  2. .main {
  3. background: $color-orange;
  4. display: flex;
  5. flex-direction: row;
  6. flex-wrap: wrap;
  7. justify-content: center;
  8. align-items: center;
  9. }
还需要另外一个配置文件: ./src/_scss/postcss.config.js

  1. module.exports = {
  2. plugins: [require("autoprefixer")]
  3. };
然后,在packgage.json 里添加浏览器配置:

  1. "browserslist": ["last 2 versions"]
然后运行指令: npm run build, 重新刷新index.html,可以看到页面已经有了样式。

4.结合Babel编译JS文件,并压缩

现在已经是ES6的时代了,但是并不是所有的浏览器都认识ES6的语法,所以出现了Babel,转译ES6为ES5,让浏览器都能运行。同样的,也需要loader:

  1. npm i babel-core babel-loader babel-preset-env --save-dev
然后更新webpack.config.js文件:

  1. {//添加到rules 数组中
  2. test: /\.js$/,
  3. use: {
  4. loader: "babel-loader",
  5. options: {
  6. presets: ["env"]
  7. }
  8. }
  9. }
这时,我们就可以在 ./src/js/index.js 文件里写ES6语法了:

  1. console.log(`I've been required by Webpack`);
  2. import './es6code'; // 新增
在同路径下,新建一个js文件:./src/js/es6code.js

  1. (() => {
  2. const IAmES6 = `I've been transpiled by Babel`;
  3. console.log(IAmES6);
  4. })();
运行 npm run build,刷新 index.html,可以在控制台看到输出

5.监听文件变化并在保存时重新编译,刷新页面

虽然在package.json 文件中我们已经添加了监听指令

  1. "scripts": {
  2. "build": "webpack",
  3. "watch": "webpack --watch"
  4. }
但是我们可以用 Webpack Dev Server 做的更好。

Webpack Dev Server 到底做了什么呢?

它只需要行配置就可以启动并运行一个开发服务器。一旦配置好,你就会运行一个npm 脚本,Webpack将会在浏览器中启动你的项目。

安装Webpack Dev Server

  1. npm i webpack-dev-server --save-dev

然后更新 webpakc.config.js文件:在output 声明下添加下面的配置

  1. devServer: {
  2. contentBase: "./build"
  3. }
在package.json更新指令:

  1. "scripts": {
  2. "start": "webpack-dev-server --open",
  3. "build": "webpack",
  4. "watch": "webpack --watch"
  5. }
然后执行 npm start ,奇迹发生了,项目在浏览器自动启动在 localhost:8080,并且,项目代码改变时,代码自动重新编译,页面会自动刷新。


以上是针对国外大神的blog翻译整理的,原文链接:

How to switch from Gulp to Webpack: a tutorial to get you started


文末还提供了一些链接,可以更深入的学习webpack。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值