webpack学习笔记

如果你是新手,已经了解什么是CommonJS/AMD以及gulp等,请参照过程,一步一步来,请尽量使用复制粘贴来处理文件内容(因为代码比较简单,理解就好,减少不必要的抄写同时也能避免一些低级错误),以理解学会使用为主。

学习过程仅供参考。入门学习,建议有基础的就不必看了。
对webpack的理解,官网有图描述,这里就不抄了。https://webpack.github.io/
使用gitbash进行操作。(Windows系统)

以实现一个 webpack 的 Hello World为例,满足以下功能:

  1. CSS 用 Less 或 SCSS 实现
  2. 图片使用 Webpack 引入、压缩
  3. JS 使用 ES Modules 语法,然后用 Babel 转为 ES 5
  4. 所有代码都要最小化(压缩)
  5. 要有缓存控制(GitHub 自带功能)也就是说文件名应该是 bundle-xxxxxxxxxxx.js*

一.安装webpack

a.当前目录安装

注意:要在当前目录安装首先要保证目录下有``package.json``文件,如果当前目录文件为空,请执行npm init。
安装webpack

$ npm install --save-dev webpack    //本地安装webpack

安装结束之后,执行

$ ./node_modules/.bin/webpack --help

可执行未报错,则说明安装成功。

b. 全局安装webpack
$ npm install -g webpack    //全局安装webpack

安装结束之后,执行

$ webpack --help

,可执行未报错,则说明安装成功。
最后执行git init命令,初始化git仓库。新建.gitignore文件,并且在里面加上一行 node_modules,然后再把已有文件,git addgit commit

二.webpack怎么用?(如何学习?copy--run--modify)

webpack是一个模块打包器。
关于模块,webpack支持CommonJS/AMD这两种大家比较熟悉的模块加载方式。ES Modules加载模块方式webpack也支持。

(1). copy--官网示例https://webpack.js.org/guides/getting-started/
官网示例.png

跟着示例,创建目录文件

$ touch index.html
$ mkdir src
$ touch src/index.js
$ vi index.html       //copy--官网index.html文件内容
$ vi src/index.js     //copy--官网index.js文件内容

然后根据指引创建bundle.js

$ mkdir dist
$ mv index.html dist
$ npm install --save lodash   //安装一个操作数组的库,以便index.js使用这个库

安装lodash之后,便可以在index.js中直接使用import的方式来引用lodash库。

index.js

参考官网内容copy。
index.html也需要修改

index.html

然后运行本地webpack

$ ./node_modules/.bin/webpack src/index.js dist/bundle.js

查看bundle.js是否创建成功

$ ll dist
index.html     bundle.js   //创建成功
(2).run--浏览器中打开index.html,查看是否报错。
$ open dist/index.html

如若需要将本目录初始化为git仓库,建议执行git init,创建.gitignore文件,并且在里面加上一行 node_modules,以防止你把这个目录上传到 GitHub 上。

插播:可修改package.json文件

package.json

打包时,执行命令npm run build既可。

到了这里,示例过程其实很简单,就是webpacklodash的js模块打包,不用放在html中去单独引入模块了。

(3).modify--安装jQuery,使用jQueryindex.js并且实现打包

接下来就是modify(修改),安装jQuery,在index.js 中引入,并使用jQuery的语法写index.js中的语句。

$ npm i -S jquery

然后改写src/index.js

import _ from 'lodash';
import $ from 'jquery';

function component() {
  var $div = $('<div/>')

    // Lodash, currently included via a script, is required for this line to work
      $div.html(_.join(['Hello', 'webpack'], ' '));

        return $div;
    }

    $(document.body).append(component());

然后打包,查看页面是否报错。

$ npm run build
$ open dist/index.html

插播 :如何引用本地js文件?
首先创建一个js文件,操作如下:

$ touch src/amyli.js
$ vi src/amyli.js   //文件内容copy下面提供的代码

amyli.js

let name = 'amyli';
let age = '18';
let gender = 'female';

function sayHi() {
    console.log('Hi,I am ${name}')
}

export {
name,
age,
gender,
sayHi
}    //输出对象

与此同时,index.js中的引入方式:

import _ from 'lodash';
import $ from 'jquery';
import * as AmyLi from './AmyLi.js';

AmyLi.sayHi();

function component() {
  var $div = $('<div/>')

    // Lodash, currently included via a script, is required for this line to work
      $div.html(_.join(['Hello', 'webpack'], ' '));

        return $div;
    }

    $(document.body).append(component());

import用法
export用法
然后执行打包

$ npm run build

至此,大家通过上面的示例操作,对webpack的一个基本的打包过程,应该就有所了解了。简而言之,三步走:

  1. 本地安装模块,
  2. 引入模块到index.js或者main.js
  3. webpack打包到目标发布文件。

同理可猜测,css/less/sass/图片等引入过程与之基本相似。

由于项目中每次进行打包的均是项目的相关文件,单个文件的操作就比较反人类了。那么接下来就化繁为简的去了解webpack配置。

三.著名的webpack配置

官方示例:

webpack.config.js创建

操作如下:

$ touch webpack.config.js
$ vi webpack.config.js      //粘贴官网示例文件内容
$ ./node_modules/.bin/webpack --config webpack.config.js  //打包时执行配置文件设置

当前的配置文件内容比较容易看懂,主要是对输入输出进行相关配置,可逐句读过并理解。

package.json文件中稍作修改

"build": "webpack"

执行打包命令

npm run build

看了这么久,接下来,终于要开始使用webpack实现去本文开头提到的5个功能了。不要心急,有了上面做基础,你会发现下面就很容易了。

示例中,在index.js中引入js类的模块时,webpack通过webpack.config.js知道如何处理js,编译之后打包成一个浏览器支持的js文件。
而其他类型的文件,几乎都有加载器可以使用,我们可根据需要安装加载器,然后进行配置,来告诉webpack如何进行打包。

1.css打包

具体操作如下:

$ touch index.css
$ vi index.css

index.css

body{
    background: #ddd;
    color: red;
    display: flex;
}

index.js

import _ from 'lodash';
import $ from 'jquery';
import './index.css'

function component() {
  var $div = $('<div/>')

    // Lodash, currently included via a script, is required for this line to work
      $div.html(_.join(['Hello', 'webpack'], ' '));

        return $div;
    }

    $(document.body).append(component());

webpack.config.js

var path = require('path');

module.exports = {
    // 入口  main.js
    entry: './src/index.js',
    //输出
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    module: {
        loaders: [
            {
                test: /\.css$/,
                loader:'style-loader!css-loader!autoprefixer-loader'  //3个loader
            }
        ]
    }
};

//前两个loader是告诉webpack如何打包css,具体效果打开index.html查看css,最后一个loader,给相关css属性加前缀,还可以设置兼容版本等。

然后执行

$ npm run build

结果报错,提示安装loader

打包报错.png

按照提示,配置参数,安装loader

$ npm i -D style-loader
$ npm i -D css-loader
$ npm i -D autoprefixer-loader

再次执行

$ npm run build

打包未报错,打开index.html,查看css样式是否成功引入。
一般执行下来顺利,css便能成功打包在浏览器可执行。

2.图片打包压缩

将xxx.png文件放入src文件夹中。
打开编辑index.js

import _ from 'lodash';
import $ from 'jquery';
import './index.css'     
//import png from './1.jpg'

var img1 = document.createElement("img");  
img1.src = require("./1.jpg");       //img1.src = png; 
document.body.appendChild(img1);

function component() {
  var $div = $('<div/>')

    // Lodash, currently included via a script, is required for this line to work
      $div.html(_.join(['Hello', 'webpack'], ' '));

        return $div;
    }

    $(document.body).append(component());

webpack.config.js

var path = require('path');

module.exports = {
    // 入口  main.js
    entry: './src/index.js',
    //输出
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    module: {
        loaders: [
            {
                test: /\.css$/,
                loader:'style-loader!css-loader!autoprefixer-loader'
            },
            {
                test: /\.(png|jpg)$/,
                //loader: 'url-loader?limit=8192'
                loaders: [
                    'file-loader?hash=sha512&digest=hex&name=[hash].[ext]',
                    'image-webpack-loader?bypassOnDebug&optimizationLevel=7&interlaced=false'
                ]
            }
        ]
    }
};
//这里处理图片的loader给配置了图片压缩功能的loader

安装配置所需loader

$ npm i -D url-loader
$ npm i -D file-loader
$ npm i - D image-webpack-loader

执行build

$ npm run build

未报错,打开index.html,查看是否成功加载图片。
加载成功并做了压缩。

3.sass/scss打包

首先要使用sass需要先安装sass。

$ export SASS_BINARY_SITE="https://npm.taobao.org/mirrors/node-sass"
//先设置指定下载sass地址(历史问题)
$ nmp i -D node-sass
//安装中

index.js

import _ from 'lodash';
import $ from 'jquery';
import './index.sass'

var img1 = document.createElement("img");
img1.src = require("./1.jpg");
document.body.appendChild(img1);

function component() {
  var $div = $('<div/>')

    // Lodash, currently included via a script, is required for this line to work
      $div.html(_.join(['Hello', 'webpack'], ' '));

        return $div;
    }

    $(document.body).append(component());

index.sass

body{
  background: #ddd;
  color: white;
  display: flex;
  div{
    background: border-box;
  }
}

webpack.config.js

var path = require('path');

module.exports = {
    // 入口  main.js
    entry: './src/index.js',
    //输出
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    module: {
        loaders: [
            {
                test: /\.sass$/,
                loaders: [
                    'style-loader',
                    'css-loader',
                    'autoprefixer-loader',
                    'sass-loader'
                ]
            },
            {
                test: /\.(png|jpg)$/,
                //loader: 'url-loader?limit=8192'
                loaders: [
                    'file-loader?hash=sha512&digest=hex&name=[hash].[ext]',
                    'image-webpack-loader'
                ]
            }

        ]
    }
};

安装所需加载器,sass-loader,并打包

$ npm i -D sass-loder
$ npm run build

打包成功后,打开index.html,查看样式是否编译成功。
成功了,说明你抄对了。

看了这么多我们大概也能了解到为何需要去设置配置文件了。无非是各种类型的文件的各种打包,在配置文件中设置打包文件的加载器,下载与配置相应的loader进行安装,以便打包的时候使用。

webpack --help中有webpack --watch命令:
Watch the filesystem for changes,方便开发时,打包项目文件。
有兴趣的新手可以体验一下。

4.所有代码都要最小化(压缩)--自动刷新&发布

要实现自动刷新,先安装webpack-dev-server

$ npm install webpack-dev-server  //安装server

配置server的目标文件
webpack.config.js

var path = require('path');

module.exports = {
    // 入口  main.js
    entry: './src/index.js',
    //输出
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    devServer: {
        contentBase: path.join(__dirname, "dist"),    //目标文件夹
        compress: true,                           //是否压缩:是
        port: 9000                            //设置端口
    },                  //配置server的目标文件
    module: {
        loaders: [
            {
                test: /\.scss$/,
                loaders: [
                    'style-loader',
                    'css-loader',
                    'autoprefixer-loader',
                    'sass-loader'
                ]
            },
            {
                test: /\.(png|jpg)$/,
                //loader: 'url-loader?limit=8192'
                loaders: [
                    'file-loader?hash=sha512&digest=hex&name=[hash].[ext]',
                    'image-webpack-loader'
                ]
            }

        ]
    }
};

执行命令行

$  ./node_modules/.bin/webpack-dev-server

输入命令后,项目运行,打开http://localhost:9000,本地修改项目文件时,浏览器会自动刷新页面。

最后一步:发布deploy
当项目需要进行发布的时候,目前的编译打包虽然已经完成,但细心的童鞋会发现,dist中的文件其实很大。webpack提供了webpack -p命令行来做最后的项目文件最小化。

$ webpack -p   //最小化项目文件,用作生产环境

执行之后再打开index.html,发现加载的bundle.js,比build之后的更加小。也更加符合生产环境的需求。

最后提交代码git add,git commit,git push到远程仓库。

5.缓存控制

为了生成缓存的bundle.js,通常做法就是文件名+hash,配置中可以直接进行配置。
webpack.config.js

var path = require('path');

module.exports = {
    // 入口  main.js
    entry: './src/index.js',
    //输出
    output: {
        filename: 'bundle-[hash].js',     //具有缓存控制的输出
        path: path.resolve(__dirname, 'dist')
    },
    devServer: {
        contentBase: path.join(__dirname, "dist"),
        compress: true,
        port: 9000
    },
    module: {
        loaders: [
            {
                test: /\.scss$/,
                loaders: [
                    'style-loader',
                    'css-loader',
                    'autoprefixer-loader',
                    'sass-loader'
                ]
            },
            {
                test: /\.(png|jpg)$/,
                //loader: 'url-loader?limit=8192'
                loaders: [
                    'file-loader?hash=sha512&digest=hex&name=[hash].[ext]',
                    'image-webpack-loader'
                ]
            }

        ]
    }
};

与此同时,当bundle.js文件名有了hash之后,每次修改hash都不同。路径手动去改就比较麻烦了。这里我们可以使用插件来自动生成index.html文件,路径也随之自动生成。操作入下:
安装插件:html-webpack-plugin

$ npm i -D html-webpack-plugin

webpack.config.js

ar path = require('path');
var HtmlwebpackPlugin = require('html-webpack-plugin');

module.exports = {
    // 入口  main.js
    entry: './src/index.js',
    //输出
    output: {
        filename: 'bundle-[hash].js',
        path: path.resolve(__dirname, 'dist')
    },
    devServer: {
        contentBase: path.join(__dirname, "dist"),
        compress: true,
        port: 9000
    },
    plugins: [
        new HtmlwebpackPlugin({
            title: "webpack-demo",   //设置生成的html,title
            filename: "index.html"    //html命名
        })
    ],
    module: {
        loaders: [
            {
                test: /\.scss$/,
                loaders: [
                    'style-loader',
                    'css-loader',
                    'autoprefixer-loader',
                    'sass-loader'
                ]
            },
            {
                test: /\.(png|jpg)$/,
                //loader: 'url-loader?limit=8192'
                loaders: [
                    'file-loader?hash=sha512&digest=hex&name=[hash].[ext]',
                    'image-webpack-loader'
                ]
            }

        ]
    }
};

删除dist/index.html之后

$ webpack -p   //打包、最小化

执行结果

发布.png

打开index.html,这时候观察bundle.js是否成功引入。

引入成功.png

至此,关于webpack的一些基本用法就讲到这里了。还有一些webpack插件,大家可以去看看阮一峰webpack教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容

  • Webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成...
    EarthChen阅读 389评论 0 1
  • 什么是Webpack? 按照官方文档的解释,Webpack就是个模块打包工具,将模块及其依赖打包生成静态资源。在W...
    Www刘阅读 667评论 2 10
  • 这是我第二次学习webpack了,初见他时,我是一脸懵逼的,这次再见时,稍微轻松了一点,现在写下这份学习笔记,用来...
    ruby0922阅读 306评论 0 0
  • 在现在的前端开发中,前后端分离、模块化开发、版本控制、文件合并与压缩、mock数据等等一些原本后端的思想开始...
    Charlot阅读 5,428评论 1 32
  • 无意中看到zhangwnag大佬分享的webpack教程感觉受益匪浅,特此分享以备自己日后查看,也希望更多的人看到...
    小小字符阅读 8,134评论 7 35