我的webpack使用

webpack作为模块打包机,在前端模块化开发中频繁的被使用。本篇主要记录一些我自己在学习和使用webpack中遇到问题,保存的一些比较好的博客文章和自己项目的webpack的配置文档,方便以后项目中使用时参考,不用每次都去翻老项目看webpack配置,有些第三方loader和插件的配置或者名称有时就是想不起来(看来老了呀)。

如果想学习webpack的相关内容可以从下面第一小节关于webpack的一些资源bolg中查看一些网上的教程,如果你对gulp和webpack有疑问,想了解他们的区别也可以看一下这篇Gulp和Webpack对比

关于webpack的一些资源bolg

  1. 入门Webpack,看这篇就够了
  2. Webpack 中文指南
  3. Webpack课件
  4. Webpack学习总结
  5. Webpack学习总结 另一份
  6. webpack在PC项目中的应用
  7. 图片的路径与打包
  8. webpack 教程资源收集(包括与Vue,与React,与Angular项目使用)
  9. 阮一峰老师的webpack-demos

上面这些关于webpack的资源已经可以满足你对webpack的学习了,其中每篇Bolg各有千秋,都有自己侧重点,值得好好学习。

webpack配置文件

单独使用

所谓的单独使用就是在项目开发过程中,直接通过webpack或者webpack server来使用webpack的相关功能。与之相对的是通过nodeJS来配合使用webpack,下一小节介绍。

当我单独使用webpack时,我的配置文件就一个webpack.config.js,简单配置,可根据不通项目添加loader和plugins。

var Webpack = require('webpack');
var Et = require('extract-text-webpack-plugin');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var OpenBrowserPlugin = require('open-browser-webpack-plugin');
var CopyWebpackPlugin = require('copy-webpack-plugin');

module.exports = {
  devtool: 'eval-source-map',//配置生成Source Maps,选择合适的选项
  entry: [ __dirname + "/src/scripts/app.js"],//唯一入口文件,可以是对象或者数组
  output: {
    path: __dirname + "/prd/",//打包后的文件存放的地方
    //filename: "[name]-[hash].js"//打包后输出文件的文件名并且版本控制,一般不用与生产环境中
    filename: "bundle.js"//打包后输出文件的文件名
  },
  module:{
    loaders:[
      {
        test:/\.css$/,
        loader:'style!css'
      },
      {
        test: /\.scss$/,
        loader: Et.extract('style','css!sass')//从js中抽离scss文件
        // loader:'style!css!sass'
      },
      {
        test:/\.js$/,
        exclude: /node_modules/,//屏蔽不需要处理的文件(文件夹)(可选)
        loader:'babel'
      },
      {
        test:/\.string$/,
        loader:'string'
      },
      // {
      //   test: /\.html$/,
      //   loader: 'html-withimg-loader'
      // },
      {
     test: /\.(png|jpg|jpeg|gif)$/,
     loader: 'url-loader?limit=8192&name=images/[hash:8].[name].[ext]'//图片打包限制,这个限制并不是说超过了就不能打包,而是指当图片大小小于限制时会自动转成 base64 码引用。上例中大于8192字节的图片正常打包,小于8192字节的图片以 base64 的方式引用。
    }
    ]
  },
  plugins: [
    //复制文件
    new CopyWebpackPlugin([
       {
         from : './src/images',//定义要拷贝的源目录   __dirname + ‘/src/public’
         to : './images',//定义要拷贝的目标目录  __dirname + ‘/dist’
        //  toType : 'dir'//file 或者 dir , 可选,默认是文件
        //  force : 强制覆盖先前的插件 , 可选 默认false
        //  context : 不知道作用 , 可选 默认 base context 可用 specific context
        //  flatten :只拷贝文件不管文件夹 , 默认是false
        //  ignore : 忽略拷贝指定的文件 ,可以用模糊匹配
      },{
        from : './index.html',//定义要拷贝的源目录   __dirname + ‘/src/public’
      }
   ]),
    //自动打开浏览器
    new OpenBrowserPlugin({url: 'http://localhost:80/' + 'index.html'}),
    //js文件压缩
    //new Webpack.optimize.UglifyJsPlugin(),
    //从js中抽离scss文件并且版本控制
    //new Et('[name]-[hash].css')
    new Et('bundle.css'),//从js中抽离scss文件
    //html文件操作
    // new HtmlWebpackPlugin({
    //       template: './prd/index.html',
    //   })
  ],
  devServer: {
    contentBase:  __dirname + '/prd',//本地服务器所加载的页面所在的目录
    port:8080,
    colors: true,//终端中输出结果为彩色
    //historyApiFallback: true,//不跳转
    inline: true,//实时刷新
    hot: true//热启动
  }
}

以上配置不代表任何含义,只是一个有助于自己以后方便查找的文档而已。

通过NodeJS使用

此时需要一个另外配置server.js,通过node运行server.js来加载配置文件。

server.js

var webpack = require('webpack');
var webpackeDevServer = require('webpack-dev-server');
var config = require('./webpack.config.js');//webpack配置文件路径

new webpackeDevServer(webpack(config),{
  contentBase:  __dirname + '/prd',//本地服务器所加载的页面所在的目录
  port:80,
  colors: true,//终端中输出结果为彩色
  quiet: false, //控制台中不输出打包的信息
  historyApiFallback: true,//不跳转
  inline: true,//实时刷新
  hot: true,//热启动
  progress: true, //显示打包的进度
  lazy: false,//懒加载
  //反向代理
  proxy:{
    '/http://chping.site/*':{
      target:'http:localhost:3000',
      pathRewrite: {
        '^/http://chping.site/':''
      }
    }
  }
}).listen(80,'localhost',function(err,result){
  if(err){
    console.log(err);
  }else{
    console.log('listening at localhost:80');
  }
});

webpack.config.js

var Webpack = require('webpack');
var Et = require('extract-text-webpack-plugin');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var OpenBrowserPlugin = require('open-browser-webpack-plugin');
var CopyWebpackPlugin = require('copy-webpack-plugin');

module.exports = {
  devtool: 'eval-source-map',//配置生成Source Maps,选择合适的选项
  entry: [
    //react-hot配置
    'webpack-dev-server/client?http://localhost',
    'webpack/hot/only-dev-server',
        __dirname + "/src/scripts/app.js",
    ],//已多次提及的唯一入口文件
  output: {
    path: __dirname + "/prd/",//打包后的文件存放的地方
    //filename: "[name]-[hash].js"//打包后输出文件的文件名并且版本控制
    filename: "bundle.js"//打包后输出文件的文件名
  },
  module:{
    loaders:[
      {
        test:/\.css$/,
        loader:'style!css'
      },
      {
        test: /\.scss$/,
        loader: Et.extract('style','css!sass')//从js中抽离scss文件
        // loader:'style!css!sass'
      },
      {
        test:/\.js$/,
        exclude: /node_modules/,//屏蔽不需要处理的文件(文件夹)(可选)
        loader:'babel'
      },
      {
        test:/\.string$/,
        loader:'string'
      },
      // {
      //   test: /\.html$/,
      //   loader: 'html-withimg-loader'
      // },
      {
     test: /\.(png|jpg|jpeg|gif)$/,
     loader: 'url-loader?limit=8192&name=images/[hash:8].[name].[ext]'//图片打包限制,这个限制并不是说超过了就不能打包,而是指当图片大小小于限制时会自动转成 base64 码引用。上例中大于8192字节的图片正常打包,小于8192字节的图片以 base64 的方式引用。
    }
    ]
  },
  plugins: [
    //plugin热启动
    new Webpack.HotModuleReplacementPlugin(),
    //复制文件
    new CopyWebpackPlugin([
       {
         from : './src/images',//定义要拷贝的源目录   __dirname + ‘/src/public’
         to : './images',//定义要拷贝的目标目录  __dirname + ‘/dist’
        //  toType : 'dir'//file 或者 dir , 可选,默认是文件
        //  force : 强制覆盖先前的插件 , 可选 默认false
        //  context : 不知道作用 , 可选 默认 base context 可用 specific context
        //  flatten :只拷贝文件不管文件夹 , 默认是false
        //  ignore : 忽略拷贝指定的文件 ,可以用模糊匹配
      },{
        from : './index.html',//定义要拷贝的源目录   __dirname + ‘/src/public’
      }
   ]),
    //自动打开浏览器
    new OpenBrowserPlugin({url: 'http://localhost:80/' + 'index.html'}),
    //js文件压缩
    //new Webpack.optimize.UglifyJsPlugin(),
    //从js中抽离scss文件并且版本控制
    //new Et('[name]-[hash].css')
    new Et('bundle.css'),//从js中抽离scss文件
    //html文件操作
    // new HtmlWebpackPlugin({
    //       template: './prd/index.html',
    //   })
  ]
}

相比较单独使用的webpack配置文件,此处的webpack.config.js文件中取消了dev-server的配置,并且在入口entry中添加了部分设置和在plugins中添加了热启动的相关配置。

React中使用

React开发中使用webpack是件很美妙的事情,这里有篇文章可以了解一下深入浅出React(二):React开发神器Webpack,热更新是个很方便使用的技能,用webpack实现其实也不难,只需要安装一个react-hot-loader,然后简单配置一下就好了。下面是webpack的相关配置:

server.js文件同上一小节总NodeJS中一致,下面是webpack.config.js的配置,重点注意入口文件配置项和plugins配置。

var webpack = require('webpack');
var ET = require('extract-text-webpack-plugin');

module.exports = {
  // 入口
  entry: [
    'webpack-dev-server/client?http://localhost',
    'webpack/hot/only-dev-server',
    __dirname + '/src/scripts/app.js'
  ],

  // 出口
  output: {
    path: __dirname + '/prd',
    // filename: '[name]-[hash].js'
    filename: 'bundle.js'
  },

  // sourcemap
  devtool: 'source-map',

  // 配置模块
  module: {
    loaders: [
      {
        test: /\.js$/,
        exclude: /node_modues/,
        loader: 'babel'
      },
      {
        test: /\.jsx$/,
        exclude: /node_modues/,
        loader: 'babel'
      },
      {
        test: /\.css$/,
        loader: 'style!css'
      },
      {
        test: /\.scss$/,
        loader: ET.extract('style', 'css!sass')
      }
    ]
  },

  //plugins定义
  plugins: [
    // new webpack.optimize.UglifyJsPlugin(),
    new ET('bundle.css', {
      allChunks: true
    }),
    new webpack.HotModuleReplacementPlugin()
  ]
}

另外除了webpack.config.js文件的配置外,在react的入口文件(或者说使用react-dom的文件中)添加三行语句:

'use strict';
import '../styles/usage/page/app.scss';

import React from 'react';
import ReactDOM from 'react-dom';

import MyButtonController from './flux/components/MyButtonController.jsx';

let app = document.getElementById('app');

ReactDOM.render(
  <MyButtonController />
  , app);

//热更新三行语句
if (module.hot) {
  module.hot.accept();
}

这样就可以开发react时使用热更新了。

常用插件和loader

css-loader: css文件加载
sass-loader: scss文件加载
less-loader: less文件加载
extract-text-webpack-plgin: css文件抽离插件

html-loader: html文件加载
html-webpack-plugin: 创建默认html文件插件

js-loader: js文件加载
string-loader: string文件加载
url-loader: 图片加载打包
vue-loader: vue文件加载
jsx-loader: jsx文件加载/js文件也可以
react-hot-loader: react热更新

open-browser-webpack-plgin: 自动打开浏览器插件
copy-webpack-plgin: 文件复制插件
webpack-dev-server: 本地server服务

更多loader请参照官方文档

小结

以后就可以不用翻老项目找配置文件了。。。

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

推荐阅读更多精彩内容