Webpack 4.X 从入门到放肆

webpack 4:Webpack4.X从零配置开始

1、创建一个新目录并进入该目录:
  mkdir webpack-4.X && cd $_

完成之后进入创建好的文件夹,完成以下操作

2、通过运行以下命令初始化 package.json
 npm init -y
3、并引入 webpack 4:
npm i webpack --save-dev
4、我们还需要 webpack-cli ,作为一个单独的包引入:
npm i webpack-cli --save-dev
5、现在打开 package.json 并添加一个 build(构建) 脚本:

package.json 代码:

 "scripts":  {
 "build":  "webpack"
 }
6、关闭文件并保存。

尝试运行:

npm run build

看看会发生什么:

Insufficient number of arguments or no entry found.
Alternatively, run 'webpack(-cli) --help' for usage info.

Hash: e22d9cbf4c86c79ab1fd
Version: webpack 4.28.0
Time: 157ms
Built at: 2018-12-20 09:40:10

WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for thisvalue. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/concepts/mode/

ERROR in Entry module not found: Error: Can't resolve './src' in '/Users/wujiahao/webTest/webpack-4.X'
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! webpack-4.X@1.0.0 build: `webpack`
npm ERR! Exit status 2
npm ERR!
npm ERR! Failed at the webpack-4.X@1.0.0 build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/wujiahao/.npm/_logs/2018-12-20T01_40_10_578Z-debug.log

webpack 4 在 ./src 中寻找 entry point(入口点) ! 如果您不知道什么是入口,请查看 官方的说明文档

简而言之: entry point(入口点) 是 webpack 寻找开始构建 Javascript 包的文件。

在以前版本的 webpack 中,必须在名为 webpack.config.js 的配置文件中 通过 entry 属性定义 entry point(入口点) 。

但是 从 webpack 4 开始,不再必须定义 entry point(入口点) :它将默认为 ./src/index.js

7、测试这个新功能很简单。 创建 ./src/index.js

index.js 代码:

console.log(`I'm yi ge ru kou wen jian`);//调皮了一下
8、然后运行构建命令:
 npm run build

你将在 ~/webpack-4.X/dist/main.js 中获取该 bundle(包) 。

什么? 稍等片刻。 没有必要定义输出文件? 对的。

在 webpack 4 中,既不必须定义 entry point(入口点) ,也不必须定义 output file(输出文件)。

webpack 的主要优势在于 code splitting(代码拆分)。 但请相信我,使用零配置工具可以加快速度。

所以这是第一条新闻:webpack 4 不是必须要有配置文件

它将查找 ./src/index.js 作为默认入口点。 而且,它会在 ./dist/main.js 中输出模块包。

在下一节中,我们将看到 webpack 4 的另一个不错的功能:生产和开发模式。

webpack 4:production(生产) 和 development(开发) 模式

拥有2个配置文件在 webpack 中是的常见模式。

一个典型的项目可能有:

  • 用于开发的配置文件,用于定义 webpack dev server 和其他东西
  • 用于生产的配置文件,用于定义 UglifyJSPlugin,sourcemaps 等

虽然较大的项目可能仍然需要 2 个配置文件,但在 webpack 4 中,您可以在没有一行配置的情况下完成。

怎么会这样?

webpack 4 引入了 production(生产)development(开发) 模式。

事实上,如果你注意 npm run build 的输出,你会看到一个很好的警告:

WARNING in configuration
The 'mode' option has not been set,
 webpack will fallback to 'production' for thisvalue.
 Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: 
https://webpack.js.org/concepts/mode/

警告在配置
“mode”选项还没有设置,webpack将返回到“production”。集
“开发”或“生产”的“模式”选项
为每个环境启用默认值。
您还可以将其设置为“none”,以禁用任何默认行为。了解更多信息:https://webpack.js.org/concepts/mode/

那是什么意思? 让我们来看看。

打开 package.json 并填充 script 部分,如下所示:

package.json 代码:

"scripts":  {
    "dev":  "webpack --mode development",
    "build":  "webpack --mode production"
  }

现在尝试运行:

npm run dev

并看看 ./dist/main.js 。 你看到了什么? 是的,我知道,一个让人疑惑的 bundle(包) 文件…,并没有压缩的文件!

现在尝试运行:

npm run build

再来看看 ./dist/main.js 。 你会看见一个 压缩后的 bundle(包)

是的!

production mode(生产模式) 可以开箱即用地进行各种优化。 包括压缩,作用域提升,tree-shaking 等。

另一方面,development mode(开发模式)针对速度进行了优化,仅仅提供了一种不压缩的 bundle

所以这是第二条新闻:webpack 4 引入了 production(生产)development(开发) 模式。

在 webpack 4 中,您可以在没有一行配置的情况下完成任务! 只需定义--mode 参数即可免费获得所有内容!

webpack 4:覆盖默认 entry(入口)/output(输出)

我喜欢 webpack 4 零配置,但如何覆盖默认 entry point(入口点) 和 默认 output(输出) 呢?

package.json 中配置它们!

这是一个例子,输入的内容的文件夹和文件必须存在,输出的无所谓 如下例./entry/src/js/index.js 这个入口文件必须存在:

package.json 代码:

1.  "scripts":  {
2.  "dev":  "webpack --mode development ./entry/src/js/index.js --output ./entry/main.js",
3.  "build":  "webpack --mode production ./entry/src/js/index.js --output ./entry/main.js"
4.  }

也可以在webpack.config.js当中

module.exports = {
  entry: {
    main: './entry/src/js/index.js'
  },
  output: {
    filename: './entry/main.js',
  }
};

webpack 4:用 Babel 7 转译 Javascript ES6

吴佳浩的个人博客

现代 Javascript 主要是用 ES6 编写的。

但并非每个浏览器都知道如何处理 ES6 。 我们需要某种转换。

这个转换步骤称为 transpiling(转译)。 transpiling(转译)是指采用 ES6 并使旧浏览器可以理解的行为。

Webpack 不知道如何进行转换但是有 loader(加载器) :将它们视为转译器。

babel-loader 是一个 webpack 的 loader(加载器),用于将 ES6 及以上版本转译至 ES5 。

要开始使用 loader ,我们需要安装一堆依赖项。 尤其是:

  • babel-core
  • babel-loader
  • babel-preset-env 用于将 Javascript ES6 代码编译为 ES5

我们开始动手吧:

 npm i babel-core babel-loader babel-preset-env --save-dev
 npm i babel-loader @babel/core @babel/preset-env --save-dev

接下来,通过在项目文件夹中创建名为 .babelrc的新文件来配置 Babel :

.babelrc 代码:

//{
//  "presets": [
//    ["env",
//      {
//        "modules": false
//      }
//    ]
//  ]
//}
#因为新版本的babel更新 原配置修改如下
{ 
  "presets": ["@babel/preset-env"] 
}

此时我们有2个配置 babel-loader 的选项:

  • 使用 webpack 的配置文件
  • 在你的 npm scripts 中使用 --module-bind

是的,我知道你在想什么。 webpack 4 将自己作为零配置工具推向市场。 为什么要再次编写配置文件?

webpack 4 中零配置的概念适用于:

  • entry point(入口点) 默认为 ./src/index.js
  • output(输出) 默认为 ./dist/main.js
  • production(生产)development(开发) 模式 (无需为生产和开发环境创建2个单独的配置)

这就够了。 但是对于在 webpack 4 中使用 loader(加载器),您仍然需要创建配置文件。

webpack 4 中的加载器是否与 webpack 3 相同? 有没有计划为像 babel-loader 这样的普遍使用的 loader(加载器) 提供零配置?

是的!

“对于未来(在v4之后,可能是4.x或5.0),我们已经开始探索预置或附加系统将如何帮助定义它。我们不想要的是:尝试将一堆东西作为默认设置插入到 core 中,我们想要的是:允许其他人扩展“

现在你仍然必须依赖 webpack.config.js。 让我们来看看…

webpack 4:通过配置文件使用 babel-loader

给 webpack 添加一个配置文件,以最经典的方式使用 babel-loader

创建一个名为 webpack.config.js 的新文件并配置 loader(加载器) :

webpack.config.js 代码但是如果你连基本的正则表达式都看不懂我建议你补一点再来看:

module: {
    rules: [
        {
            test: /\.js$/,
            exclude: /(node_modules)/,
            use: {
                loader: 'babel-loader',
                options: {
                    presets: ['env', { modules: false }]
                }
            }
        }
    ]
}
除非您要自定义 entry point(入口点) ,否则无需指定它

接下来打开 ./src/index.js 并编写一些 ES6 代码:

index.js 代码:

 const arr =  [1,  2,  3];
 const ES6fn =  ()  => 
 console.log(...arr);
 window.ES6fn = ES6fn;

最后,创建 bundle(包):

 npm run build

现在看一下 ./dist/main.js 来查看转换后的代码。

webpack 4:不通过配置文件使用 babel-loader(在 npm scripts 中使用)

还有另一种方法来使用 webpack 的 loader(加载器)。

--module-bind 参数允许你在命令行指定加载器。 谢谢 Cezar 指出这一点。

该参数不是特定于 webpack 4 的。 从版本 3 开始就有了。

要在没有配置文件的情况下使用 babel-loader ,请在 package.json 中配置你的 npm scripts,如下所示:

package.json 代码:

  "scripts":  {
  "dev":  "webpack --mode development --module-bind js=babel-loader",
  "build":  "webpack --mode production --module-bind js=babel-loader"
  }

你可以再出运行 npm run build 构建项目。

webpack 4:为 React 项目配置 webpack 4

我的个人简介地址https://gm.gmcfg.com/

一旦你安装并配置了 babel ,这里就很容易了。

安装 React

npm i react react-dom --save-dev

接下来添加 babel-preset-react

 npm i @babel/preset-react --save-dev

.babelrc 中配置预设:

.babelrc代码:

  {
  "presets":  [
        "@babel/preset-env",  
        "@babel/preset-react"
        ]
  }

很快就完成了!

你可以配置 babel-loader 来读取 .jsx 文件。 如果你的 React 组件 正在使用 jsx 扩展,这将非常有用。

打开 webpack.config.js 并像这样配置 loader(加载器) :

webpack.config.js 代码:

  module.exports =  {
  module:  {
  rules:  [
    {
      test:  /\.(js|jsx)$/,
      exclude:  /node_modules/,
      use:  {
          loader:  "babel-loader"
      }
    }
   ]
  }
 };

要测试一下你可以在 ./src/App.js 中创建一个测试的 React 组件:

App.js 代码:

  import  React  from  "react";
  import  ReactDOM  from  "react-dom";
  const  App  =  ()  =>  {
      return  (
            <div>
                  <p>React here!</p>
            </div>
          );
    };
  export  default  App;
  ReactDOM.render(<App  />, document.getElementById("app"));

接下来在 ./src/index.js 中 import(导入) 组件:

index.js 代码:

 import  App  from  "./App";

然后再次运行构建 npm run build

webpack 4:HTML webpack 插件

webpack 需要两个额外的组件来处理HTML:html-webpack-plugin 和 html-loader。

添加依赖项:

 npm i html-webpack-plugin html-loader --save-dev

然后更新 webpack 配置:

webpack.config.js 代码:

  const  HtmlWebPackPlugin  =  require("html-webpack-plugin");
  module.exports =  {
  module:  {
  rules:  [
          {
            test:  /\.(js|jsx)$/,
            exclude:  /node_modules/,
            use:  {
                    loader:  "babel-loader"
            }
          },
          {
              test:  /\.html$/,
              use:  [
                    {
                      loader:  "html-loader",
                      options:  { minimize:  true  }
                    }
                ]
          }
    ]
  },
  plugins:  [
      new  HtmlWebPackPlugin({
              template:  "./src/index.html",
              filename:  "./index.html"
        })
      ]
  };

接下来在 ./src/index.html 中创建一个 HTML 文件:

index.html 代码:

 <!DOCTYPE html>
 <html lang="en">
 <head>
 <meta charset="utf-8">
 <title>webpack 4 quickstart</title>
 </head>
 <body>
 <div id="app">
 </div>
 </body>
 </html>

然后再次运行构建:

  npm run build

并查看 ./dist 文件夹。 您应该看到生成的 HTML 。

没有必要在 HTML 文件中引入您的 Javascript :bundle(包) 会自动注入。

在浏览器中打开 ./dist/index.html :您应该看到 React 组件正常工作!

正如您所看到的,在处理 HTML 方面没有任何改变。

webpack 4 仍然是一个针对 Javascript 的模块打包器。

但是有计划将 HTML 添加为模块(HTML作为 entry point(入口点))。

webpack 4:将 CSS 提取到一个文件中

webpack 不知道如何将 CSS 提取到一个文件中。

在过去,这是 extract-text-webpack-plugin 的工作。

不幸的是,这个插件与 webpack 4 不太兼容。

根据 Michael Ciniawsky 的说法:

extract-text-webpack-plugin 的维护已经成为了一个很大的负担,这已经不是第一次因为它的问题,而使升级 webpack 主版本变的而复杂和繁琐

mini-css-extract-plugin 可以解决这些问题。

注意:确保将 webpack 更新到 4.2.0 版。 否则 mini-css-extract-plugin 将无效!

使用以下命令安装该插件和 css-loader :

npm i mini-css-extract-plugin css-loader --save-dev

接下来创建一个用于测试的 CSS 文件:

css 代码:

  /* */
  /*  ./src/main.css */
  /* */
  body {
  line-height:  2;
  }

配置插件和 loader(加载器):

webpack.config.js 代码:

const  HtmlWebPackPlugin  =  require("html-webpack-plugin");
const  MiniCssExtractPlugin  =  require("mini-css-extract-plugin");
const path = require('path')
const webpack = require('webpack')
module.exports =  {
entry:'./src/main.js',
output: {
  filename: './src/dist/index.js',
},
devServer: {
  // 服务器的根目录 Tell the server where to serve content from
  // https://webpack.js.org/configuration/dev-server/#devserver-contentbase
  contentBase: path.join(__dirname, './src'),
  // 自动打开浏览器
  open: true,
  // 端口号
  port: 8888,
  //指定要使用的主机。默认情况下这是localhost。如果您希望外部可以访问您的服务器,请像下面这样指定
  // host:'0.0.0.0',
  // --------------- 1 热更新 -----------------
  hot: true,
  // 开启gzip压缩
  compress: true
},
module:  {
    rules:  [
          {
            test:  /\.js$/,
            exclude:  /node_modules/,
            use:  {
                loader:  "babel-loader"
            }
         },
         {
              test:  /\.html$/,
              use:  [{
                  loader:  "html-loader",
                  options:  { minimize:  true  }
              }]
            },
        {
              test:  /\.css$/,
              use:  [MiniCssExtractPlugin.loader,  "css-loader"]
              }
      ]
},
plugins:  [
//--------------------开启热更新----------------------------------
       new webpack.HotModuleReplacementPlugin(),
//--------------------开启自动将JS当中文件导入到html----------------------------------
        new  HtmlWebPackPlugin({
              template:  "./src/index.html",
              filename:  "./index.html"
       }),
      new  MiniCssExtractPlugin({
            filename:  "[name].css",
            chunkFilename:  "[id].css"
      })
  ]
};

最后在 entry point(入口点) import(导入) CSS:

index.js 代码:

1.  //
2.  // PATH OF THIS FILE: ./src/index.js
3.  //
4.  import style from  "./main.css";

然后再次运行构建:

 npm run build

并查看 ./dist 文件夹。你应该看到生成的CSS!

回顾一下:extract-text-webpack-plugin 不适用于webpack 4 。请改用 mini-css-extract-plugin 代替。

webpack 4:webpack dev server

每当你对代码进行更改时,运行 npm run dev ? 远非我们的理想。

使用 webpack 配置开发服务器只需一分钟。

配置好的 webpack dev server 将在浏览器中启动您的应用程序。

每次更改文件时,它都会自动刷新浏览器的窗口。

要设置 webpack dev server,请安装包:

 npm i webpack-dev-server --save-dev

接下来打开 package.json 并调整 scripts ,如下所示:

package.json:

  "scripts":  {
    "start":  "webpack-dev-server --mode development --open ",
    "build":  "webpack --mode production"
  }

保存并关闭文件。

现在,通过运行以下命令:

npm run start

你会看到 webpack dev server 在浏览器中启动你的应用程序。

webpack dev server 非常适合开发。 (它也可以使 React Dev Tools 在您的浏览器中正常工作)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容