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

react

学习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。


以上是 学习React,你必须知道的Webpack配置! 的全部内容, 来源链接: utcz.com/z/381873.html

回到顶部