思科DevNet

webpack学习笔记

2017-07-12  本文已影响124人  lxf_李晓凤

如果你是新手,已经了解什么是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教程

上一篇下一篇

猜你喜欢

热点阅读