webpack重点配置实践总结

历程

第一次接触webpack是在前些日子用Vue开发了一些简单demo(todoList),并且随后又开发了本博客的一些功能,想用Vue组件文件开发?,想用ES6语法?就必须上webpack了,其实之前对这构建工具很是抵触,配置麻烦,搞一大堆文件看得头晕脑胀,但又不得不用,稍微用熟了一点之后,特别是各种cli工具出来后,不得不说我之前的想法脑残了,真的是好用方便。下面文章中总结一下我使用过程中遇到的坑和一些重要的配置。

关于模块系统

Webpack可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分隔,等到实际需要的时候再异步加载。通过 loader 的转换,任何形式的资源都可以视作模块,比如 CommonJs 模块、 AMD 模块、 ES6 模块、CSS、图片、 JSON、Coffeescript、 LESS 等。

而现在web前端这块儿大部分都在使用ES6模块

import "jquery";
export function doStuff() {}
module "localModule" {}

出入口文件配置

 module.exports = {
  entry:{ 
  app:'./src/main.js'//入口文件
  },
  output: {
      path:path.resolve(__dirname, '../dist'),//存放打包后文件的输出目录
      publicPath:'/',//指定资源文件引用的目录
      filename: 'app.bundle.js',//打包文件名
  },

说明:

  • __dirname:node.js中的一个全局变量,它指向当前执行脚本所在的目录。
  • publicPath:指定资源文件在哪个目录引用,这个取决于你网站的根目录(index.html所在位置)的位置,我此处设置为'/',即表示资源文件在当前目录,这个在路径引用的时候需要特别注意。
  • 如果想要build多个文件,在entry选项中加入就行,如:
entry: ['./app.js', './utils.js']

使用别名

看如下配置:

 resolve: {
    extensions: ['', '.js', '.vue'],
    fallback: [path.join(__dirname, '../node_modules')],
    alias: {
      'vue$': 'vue/dist/vue',
      'src': path.resolve(__dirname, '../src'),
      'assets': path.resolve(__dirname, '../src/assets'),
      'components': path.resolve(__dirname, '../src/components'),
      "jquery": path.resolve(__dirname, '../node_modules/jquery/dist/jquery.slim.min.js'),
      "bootstrap": path.resolve(__dirname, '../src/plugin/bootstrap'),
    }
  }

说明:

  • extensions:用于指明程序自动补全识别哪些文件后缀
  • fallback:添加项目中的node_modules目录到解析路径中,防止模块无法被找到,这个地方还有另一个设置同样需要添加:
resolveLoader: {//此配置项和resolve平行
    fallback: [path.join(__dirname, '../node_modules')]
  }
  • alias:它的作用是把用户的一个请求重定向到另一个路径,以便在其他文件中进行引用的时候可以更方便,这个配置在插件和依赖以及静态资源比较多的时候炒鸡好用,大大节省时间。
  • path.resolve:使用前需要注意先在文件头部引入path模块:
var path = require('path')

Loader

Webpack 本身只能处理 JavaScript 模块,如果要处理其他类型的文件,就需要使用 loader 进行转换,看如下配置:

module: {
    noParse: [],
    loaders: [
      //css和sass分开加载
      { test: /\.scss$/,
        loader: ExtractTextPlugin.extract(
          "style-loader",
          "css-loader!sass-loader?sourceMap",
          {
            // 图片、字体资源打包到css上级目录
            publicPath: "../"
          }
        )
      },
      { test: /\.css$/,
        loader: ExtractTextPlugin.extract(
          "style-loader",
          "css-loader?sourceMap",
          {
            // 图片、字体资源打包到css上级目录
            publicPath: "../"
          }
        )
      },
      //vue
      {
        test: /\.vue$/,
        loader: 'vue'
      },
      // babel处理es6
      {
        test: /\.js?$/,
        exclude: [
          node_modules
        ],
        loader: 'babel'
      },
      // 图片及字体打包
      {
        test: /\.(ttf|eot|svg|png|gif|woff(2)?)(\?.*?)?$/,
        loader: "file-loader"
      }
    ]
  }

说明:

  • ExtractTextPlugin:上面加载css和sass的时候用到ExtractTextPlugin,这是一个CSS文件单独抽取的插件,可以生成便于开发环境测试的CSS source-map 并且减少DOM操作(因为在webpack默认对css打包压缩的处理中,对css文件经过处理之后是在js文件中然后通过在页面的style中插入),在下面将讲解的代码中进行插件配置才能使其生效。
  • noParse:此配置中noParse没有进行配置,但是这是一个很有用的选项,如果你确定一个模块中没有其它新的依赖 就可以配置这项,webpack 将不再扫描这个文件中的依赖,从而减少了打包时间,大大提高效率。如果不在乎构建时间可以不配置这个,毕竟人脑都容易出错,随时都会记错很多东西。

另外

比如用到了vue,要想把vue里的sass文件单独提取出来在这里就需要进行单独配置:

vue: {
  loaders: {
    sass: ExtractTextPlugin.extract('vue-style-loader', 'css-loader', 'sass-loader')
  }
}

插件

插件可以完成更多 loader 不能完成的功能

这就到了上面提到的ExtractTextPlugin,需要在这里配置:

plugins: [
    // 配置以文件形式打包css
    new ExtractTextPlugin("css/[name].css?[hash]-[chunkhash]-[contenthash]-[name]", {
      disable: false,
      allChunks: true
    })
  ]

同时不能忘记了引入:

var ExtractTextPlugin = require("extract-text-webpack-plugin");

使用Webpack加载的第三方库或插件中,基本上都需要依赖另外一些库,例如jQuery,所以这里提一下在webpack项目中使用jquery的配置,我们在前面的别名配置中已经定义好了jquery文件位置,进行如下配置:

plugins: [
    new webpack.ProvidePlugin({
      $: "jquery",
      jQuery: "jquery",
      jquery: "jquery",
      "window.jQuery": "jquery",
    })
  ]

此配置提供了一个自定义的插件,可以使jquery变成全局变量,你不用在自己的开发文件中import "jquery";了,免去了很多麻烦。

以上总结的这些差不多是webpack最基本的配置了,实际开发和生产环境中会有更多的Loaders和插件引入,比如热加载插件、html-webpack-plugin、CommonsChunkPlugin等等,总之在配置和修改配置的时候要尽量细心,毕竟配置繁多,很轻易就出错了。

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

推荐阅读更多精彩内容

  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 webpack介绍和使用 一、webpack介绍 1、由来 ...
    it筱竹阅读 10,933评论 0 21
  • GitChat技术杂谈 前言 本文较长,为了节省你的阅读时间,在文前列写作思路如下: 什么是 webpack,它要...
    萧玄辞阅读 12,613评论 7 110
  • 无意中看到zhangwnag大佬分享的webpack教程感觉受益匪浅,特此分享以备自己日后查看,也希望更多的人看到...
    小小字符阅读 8,083评论 7 35
  • 松松谢谢你,谢谢你给我写了这封信。看完信好像感觉到有一缕阳光射进来,照亮了心中的一个小角落! 我很感谢你...
    燕子Diana阅读 443评论 0 2
  • 文/见闻不是百晓生 我叫朔夜,是你的心魔。 我曾经有过很多名字,但是最喜欢的还是这一个。 朔夜,朔望之夜,多么绝望...
    见闻不是百晓生阅读 571评论 45 17