WebPack打包工具


title: WebPack打包工具
date: 2019-08-06 20:02:33
tags: [webpack,VueCli,Vue.js]
categories: Web前端


一、模块化开发

1.1 关于模块化

模块化是现在Web前端开发的趋势,它可以解决以前Js多文件协同开发会出现的命名问题等等。

再模块化下,每一个Js文件都是独立的文件,每个独立的js文件可以导入和导出数据。

像在Node.js环境下用CommonJS开发流程一样,ES6也制定了一些关于模块化开发的标准以保证他们可以再浏览器上运行。

1.2 ES6下的模块化

在ES6制定的标准中,声明一个Js为模块化文件需要在该js文件在被HTML当中引用时加入type = "module"

<script src = "./src/test.js" type="module"></script>

在Js文件中导入一个js模块

import {a,b} from './src/test.js'
//或
import value from './src/test/js' 

导出模块

export var a = 5
export var b = 4
//或
export default {
    a:5,
    b:4
}

二、WebPack工具

webpack是一个打包工具。何谓打包,就是将你的编写的模块化的Js文件联系起来,编译并压缩合成为能成被对应环境识别的文件。

现在主流的打包工具就是WebPack,配合前端框架来用简直开心。

2.1 WebPack的安装

WebPack是基于Node.js环境运行的,所以使用npm即可完成下载

npm i webpack@3.6.0 -g

现在最新版是4.x.x,但是因为3和4版本变化略大,为了便于学习,所以下载3.6.0版本。

2.2 WebPack打包JavaScript

webpack打包Js有好几种方法,最常用的是利用配置文件来打包。

2.2.1 命令行打包

webpack 入口模块 ./dist/bundle.js

2.2.2 配置文件打包

很显然,我们并不想每次都利用命令行来打包。甚至于如果有多个入口和多个出口的话每次打包都过于麻烦。所以在4.x.x版本的webpack中上面的方法已经被摒弃。

在项目文件夹中新建一个webpack.config.js文件,作为webpack打包配置文件。

一个最基本的配置文件:

module.exports = {
    entry='入口',
    output:{
        path:'绝对路径',
        filename:'文件名'
    }
}

2.3 Loader预处理打包CSS

Webpack本身只支持Js文件的打包,但是在实际开发中常常需要对css等等其他文件一并进行打包。所以Webpack有一个Loader扩展,使用对应的Loader就可以完成对css文件的打包。

  • 安装
npm i style-loader css-loader -s-d
  • 使用

在配置文件导出对象中加入

module:{
    rules:[
        {
            test:/\.css$/,
            use:['style-loader','css-loader']
        }
    ]
}

这样,你就可以使用require('./css/main.css')的方式来引用css文件了。最终我们仍然只需引用bundle。js一个文件再HTML中即可。

需要说明的是,style-loader是用于将css内容编译并挂载到Dom上,而css-loader只是负责使css文件能够通过模块化导入的方式导入到js文件当中。而且use数组中对多个loader的顺序有严格的要求。所以按照逻辑来说,应当是先css-loaderstyle-loader。但是webpack比较特殊,他是从右向左逐个使用loader

2.4 处理图片文件

在Css中我们可能会使用到以url方式引用的图片文件,但是在打包过程中将无法识别图片,所以Loader拓展给出了解决方案。

  1. url-loader

安装好url-loader后,写入以下规则即可完成对图片的打包。

其中,limit是一个阈值,如果图片文件小于该阈值,将使用base64的方式来将图片打包为一个字符串/

如果大于该阈值则自动调用file-loader来进行打包,如果未安装,则报错

            {
                test:/\.(jpg|png|jpeg|gif)$/,
                use:[
                    {
                        loader:'url-loader',
                        options:{
                            limit:4192,
                        }
                    }
                ]
            }
  1. file-loader

安装后,再使用上面的代码则可以将大于阈值的图片打包,且生成文件名为32位哈希值存放在/dist/文件夹下。

在开发过程中,html页面可能并未放在dist目录下,所以可能存在引用图片URL路径问题。只需要在webpack配置文件中的output下加入publicPath:'/dist/'即可

如果还需要对打包后的图片存放到dist下的指定目录中,且对文件名有要求,则可以这样做

            {
                test:/\.(jpg|png|jpeg|gif)$/,
                use:[
                    {
                        loader:'url-loader',
                        options:{
                            limit:4192,
                            //img/存放到dist下的img目录下
                            //[name]原图片名称
                            //[hash:8]默认为32位哈希值,过长,设置位8位
                            //[ext]原图片文件名后缀
                            name:'img/[name].[hash:8].[ext]'
                        }
                    }
                ]
            }

三、Vue结合WebPack使用方案

Vue的组件化开发固然很强,但是代码写起来过于繁杂。所以在学习VueCli之前,先了解如何结合WebPack来组件化开发Vue项目

3.1 Vue文件

建立.vue文件,我们可以这样写

<template>
    <div>
        <h1>{{ message }}</h1>
    </div>
</template>

<script>
export default {
    name:'App',
    data(){
        return {
            message:"hello adfasfdvue"
        }
    }
}
</script>

<style>
    h1{
      color: yellow
    }
</style>

3.2 配置对应的Loader

  • 安装

    1. vue-loader 能够导入.vue文件
    2. vue-template-compiler能够识别处理template标签
    npm i vue-loader@13.0.0 vue-template-compiler -s-d
    
  • 配置webpack.configrule

    {
        test:/\.vue$/,
        use:['vue-loader']
    }
    
  • 挂载一个组件只需要

    import app from 'app.vue'
    

四、WebPack高级开发

4.1 Plugin插件

Plugin是webPack的扩展插件,webPack本身也自带了一些插件。

plugin挂载在配置导出对象中的plugins数组内。

4.1.2 版权声明

在实际开发中需要在源码中写入你的版权和开源协议等等信息,可以使用webPack自带的BannerPlugin插件

const webPack = require('webpack')
module.exports = {
    entry:'xxx',
    ....,
    plugins:[
        new webPack.BannerPlugin('版权归MJK所有')
    ]
}

4.1.2 生成打包目录下的.html

实际开发中,需要把在根目录下的index.html放到dist目录下,且自动引用打包后的出口文件。所以有一个可以使用原html模板的自动生成过去的插件html-webpack-plugin

安装后的使用方法

const HtmlWebpackPlugin = require('html-webpack-plugin')
....
plugins:[
    new HtmlWebpackPlugin({
       //可设置参数,我是以项目根目录下的index.html作为生成模板,
     template:'index.html'   
    })
]

4.1.3 压缩打包后的Js文件

最终发布项目时,需要将Js代码进行压缩。uglifyjs-webpack-plugin插件可以完成该功能

配置方法

const UglifyJsWebpackPlugin = require('uglifyjs-webpack-plugin')
.....
    plugins:[
        new UglifyJsWebpackPlugin()
    ]

4.2 webpack-dev-server

nodemonlive-server这类工具一样,当项目文件发生改动时,就自动刷新。

安装后,在webpack的配置文件中进行配置

{
    entry:'xxx',
    ....,    
    devServer:{
        contentBase:'./dist',  //目标目录
        inline:true,    //实时刷新
        port:3000 //端口号
    }
}

需要在项目文件中的package.json中的scripts中添加:

 "scripts": {
    ...
    "dev": "webpack-dev-server --open"
  }

在命令行中输入如下命令即可运行

npm run dev

4.3 分离webpack配置文件

实际开发中,开发时和发布时需要执行不同的操作。此时我们不能一把把所有的配置文件都写在webpack.config.js中,而是需要进行分离。

安装能够合并webpack代码的工具——webpack-meger

Example

建立build目录,建立以下文件

    base.config.js //所有时候都要用到的配置文件
    build.config.js  //发布时需要使用
    dev.config.js    //开发时需要使用

dev.config.js

const WebpackMerge = require('webpack-merge')
const baseConfig = require('./base.config')

module.exports = WebpackMerge(baseConfig,{
    //开发时需要用
    devServer:{
        contentBase:'./dist',
        inline:true
    }
})

build.config.js

const WebpackMerge = require('webpack-merge')
const baseConfig = require('./base.config')
const UglifyJsWebpackPlugin = require('uglifyjs-webpack-plugin')
 
module.exports = WebpackMerge(baseConfig,{
    //发布时需要使用
    plugins:[
        new UglifyJsWebpackPlugin()
    ]
})
        

最后,修改下package.json中的脚本。

  "scripts": {
    ....,
    "build": "webpack --config ./build/build.config.js",
    "dev": "webpack-dev-server --open --config ./build/dev.config.js"
  },


npm run buildnpm run dev命令下就会使用不同的配置文件。

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

推荐阅读更多精彩内容

  • 什么是webpack,有什么作用 webpack是Vue的打包模块,适用于单页面应用程序(可显示页面数目小于500...
    五月唱诗班阅读 554评论 0 0
  • 上一篇介绍了Gulp,公司的React项目用的是webpack打包,抽空将webpack的知识点整理进本篇。 先简...
    张歆琳阅读 5,837评论 2 11
  • webpack安装 需要先安装node.js(npm)地址为https://nodejs.org/en/安装完成后...
    Yetv阅读 506评论 0 0
  • 一直以来就只会单纯的使用vue的脚手架,很少话时间去研究下关于vue脚手架中的webpack是如何配置,如何实现最...
    RadishHuang阅读 290评论 0 0
  • 写在开头 先说说为什么要写这篇文章, 最初的原因是组里的小朋友们看了webpack文档后, 表情都是这样的: (摘...
    Lefter阅读 5,285评论 4 31