学webpack 3,看这篇文就够了

此文档使用webpack版本为 3.4.1,在你自行测试中,可能输出结果与文档中所贴出内容不一致,请以你自己的代码为准

安装

本地安装

npm install --save-dev webpacknpm install --save-dev webpack@[version]

全局安装

npm install -g webpack

不推荐使用全局方式安装,将会影响项目中所使用的webpack版本

起步

使用CLI(命令行)

创建一个目录,并初始化package.json

mkdir webpack-test && cd webpack-test
npm init
npm install --save-dev webpack

构建基本目录及文件( / 代表目录)

webpack-test
    -- /dist
        -- index.html
    -- package.json
    -- /src
        -- index.js

编辑index.js文件

function fun(){
    document.write("Hello Webpack");
}
fun();

编辑index.html文件

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta charset="UTF-8">
    </head>
    <body>
    
    </body>
    <script src='bundle.js' charset='utf-8'></script>
</html>

在终端(工作目录为当前项目目录),输入webpack src/index.js dist/bundle.js,并回车。

在你的终端应该会出现以下类似内容:(内容也许会有差异)

λ webpack src/index.js dist/bundle.js
Hash: 0f97cc36123f295c9fd2
Version: webpack 3.4.1
Time: 260ms
    Asset     Size  Chunks             Chunk Names
bundle.js  36.9 kB       0  [emitted]  main
   [0] ./src/index.js 84 bytes {0} [built]
   [1] multi ./src/index.js ./src/index.js ./dist/bundle.js 52 bytes {0} [built]
   [2] ./src/index.css 1.08 kB {0} [built]
   [3] ./node_modules/_css-loader@0.28.4@css-loader!./src/index.css 237 bytes {0} [built]
   [7] ./dist/bundle.js 18.4 kB {0} [built]
    + 3 hidden modules

运行index.html,可以看到页面中的Hello Webpack。

使用配置文件

创建webpack.config.js文件

module.exports = {
    entry : "./src/index.js",
    output : {
        filename : "bundle.js",
        path : __dirname+"/dist"
    }
};

在终端输入webpack --config webpack.config.js 或者直接输入webpack,并回车

 webpack --config webpack.config.js
Hash: e2e4b7042538facd73f0
Version: webpack 3.4.1
Time: 216ms
    Asset     Size  Chunks             Chunk Names
bundle.js  18.4 kB       0  [emitted]  main
   [0] ./src/index.js 84 bytes {0} [built]
   [1] ./src/index.css 1.08 kB {0} [built]
   [2] ./node_modules/_css-loader@0.28.4@css-loader!./src/index.css 237 bytes {0} [built]
    + 3 hidden modules

使用npm

修改package.json文件中

{
...
"scripts": {
    "build": "webpack"
 },
...
}

在终端运行npm run build

使用source map

跟踪代码错误

修改webpack.config.js

//...省略
module.exports = {
    devtool : "inline-source-map",
    //...省略
}

修改index.js文件,故意生成一个错误

import "./index.css";
import wicon from "./webpack.png";
function fun(){
    console.log(a);
   //...省略
}

重新构建,刷新页面,在控制台可以看到如下错误

Uncaught ReferenceError: a is not defined
    at fun (index.js:4)
    at Object.<anonymous> (index.js:10)
    at __webpack_require__ (bootstrap 403852e…:19)
    at module.exports (bootstrap 403852e…:62)
    at bootstrap 403852e…:62

可以看到,错误信息及错误所在文件和行数

开发模式

  • 观察模式

    在终端输入 webpack -wwebpack --watch

    会发现执行构建后,并没有退出命令,此时正处理观察模式

    可以在package.json的scripts配置项中增加如下内容

    "scripts": {
        "watch" : "webpack --watch"
      },
    

    终端运行npm run watch 也能得到相同的效果

  • webpack-dev-server 即时刷新

    安装

    npm install --save-dev webpack-dev-server

    修改webpack.config.js

    devServer : {
      contentBase : "./dist"
    }
    

    在终端输入 webpack-dev-server 或 在package.json的scripts配置项中增加如下内容并使用npm run dev:

    "scripts": {
        "watch": "webpack --watch",
        "dev": "webpack-dev-server --open"
      },
    

    会发现会自动打开浏览器,当有任意一个源文件被修改时,会自动重新刷新页面

    **热加载模式 **

    修改webpack.config.js

    const webpack = require("webpack");
    //...省略
    plugins : [
      new webpack.HotModuleReplacementPlugin()
    ],
      //...省略
    

    修改package.json的scripts配置项

    "scripts": {
        "watch": "webpack --watch",
        "dev": "webpack-dev-server --open --hot"
      }
    

    即可开启hmr模式。即允许在运行时更新各模块,而无需进行完全刷新

loader

CSS

style-loader css-loader

css-loader用于将css文件做为模块处理,可以使用import 导入

style-loader 将所有处理完成的样式插入到页面的head中

安装

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

修改webpack.config.js

const path = require("path");
module.exports = {
    entry : "./src/index.js",
    output : {
        filename : "bundle.js",
        path : path.resolve(__dirname,"dist")
    },
    module : {
        rules : [{
            test : /\.css$/,
            use : ["style-loader","css-loader"]
        }]
    }
};

在src目录下建立index.css文件

body{
    font-size : 50px;
    color : red;
}

修改index.js文件

import "./index.css";
//...省略

在终端执行npm run build,刷新页面

less | sass

less-loader sass-loader

npm install --save-dev less less-loader

图片

file-loader

安装

npm install --save-dev file-loader

修改webpack.config.js文件

//...省略
module : {
  rules : [{
    test : /\.css$/,
    use : ["style-loader","css-loader"]
  },{
    test : /\.(png|jpg|gif|jpeg)$/,
    use : ["file-loader"]
  }]
}
//...省略

修改index.css文件

.box{
    width: 497px;
    height:270px;
    background: url(./webpack.png)
}

修改index.html文件

<body>
   <div class="box"></div>
</body>

找一张你喜爱的照片拷贝至src目录下,终端运行npm run build, 刷新页面

继续

修改index.js文件

import "./index.css";
import wicon from "./webpack.png";
function fun(){
    document.write("Hello Webpack");
    let img = new Image();
    img.src = wicon;
    document.body.appendChild(img);
}
fun();

重新执行构建,刷新页面,你可以看到两张图片

JSON数据

JSON数据的加载是内置的,可以通过 import mdata from './data.json', 即可正常使用

ES6 | JSX

babel-loader

安装 由于babel是几个模块包,对于解析不同的语言需要安装不同的包

常用的有如下:

cnpm install --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react

  • babel-core babel的核心包
  • babel-loader bable的Loader
  • babel-preset-es2015 转换ES代码
  • babel-preset-react 转换JSX代码

在src目录新增other.js

export default function say(){
    console.log("hello!!!");
}

修改index.js

import say from "./other.js";
function fun(){
    say();
   //...省略
}

修改webpack.config.js

modules : {
  //...省略
  rules : [
    //...省略
    {
    test : /\.js$/,
      use : [{
        loader : "babel-loader",
        options : {
          presets : ["es2015"]
        }
      }]
  }]
}
//...省略

重新构建,观察控制台

多文件入口

在src目录增加home.js

function fun(){
    console.log("home is output");
}
fun();

修改index.html文件

<!DOCTYPE html>
<html lang="en">
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
    </head>
    <body>
        <div class="box"></div>
    </body>
    <script src='./app.bundle.js' charset='utf-8'></script>
    <script src='./home.bundle.js' charset='utf-8'></script>
</html>

修改webpack.config.js

//...省略
entry: {
  app : "./src/index.js",
  home : "./src/home.js"
},
  output: {
    filename: "[name].bundle.js",
      path: __dirname + "/dist"
  },
//...省略

重新执行构建,并刷新页面,观察控制台

问题:如果修改webpack.config.js中第7行filename一行所输出的文件名称,重新构建,会发现在dist目录会新增新名称的文件,但index.html文件中依然引用的是旧的名字,如何解决?(参见 插件 htmlwebpackplugin)

插件

HtmlWebpackPlugin

自动生成页面

安装

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

修改webpack.config.js

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
    entry: {
        //...省略
    },
    output: {
        //...省略
    },
    plugins : [
        new HtmlWebpackPlugin()
    ],
    module: {
        //...省略
    }
};

重新执行构建,并刷新页面。

观察dist目录下的index.html,发现在测试file-loader时,创建div不见了,上述插件为我们创建一个新的html文件,并自动将output项所指定的filename引入到了页面中

clean-webpack-plugin

清理dist目录

安装

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

修改webpack.config.js

const CleanWebpackPlugin = require("clean-webpack-plugin");
//...省略
plugins : [
  new HtmlWebpackPlugin(),
  new CleanWebpackPlugin(["dist"])
],
//...省略

重新执行构建,dist目录清静了

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

推荐阅读更多精彩内容

  • 无意中看到zhangwnag大佬分享的webpack教程感觉受益匪浅,特此分享以备自己日后查看,也希望更多的人看到...
    小小字符阅读 8,140评论 7 35
  • 作者:小 boy (沪江前端开发工程师)本文原创,转载请注明作者及出处。原文地址:https://www.smas...
    iKcamp阅读 2,740评论 0 18
  • webpack 介绍 webpack 是什么 为什么引入新的打包工具 webpack 核心思想 webpack 安...
    yxsGert阅读 6,447评论 2 71
  • 小的时候都长个头去了所以没烦恼长大之后都长心眼去了所以看不透
    木卯丁阅读 169评论 0 2
  • 年少气盛时像鸟,无所牵绊飞向远方,探索心中梦想; 稍为年长时像树,不断在一处扎根,三尺讲台就是直播舞台; 慢慢老去...
    慕青映雪阅读 883评论 0 4