Webpack - 基本配置

webpack - 最热门的前端资源模块化管理打包工具

简单设置(单页面)

  • 先安装webpack npm install webpack --save-dev.
  • 在package.json里添加写脚本方便使用.
"webpack": "webpack --config webpack.config.js --progress --display-modules --colors --display-reason"
  • npm run webpack 就可以起到--config webpack.config.js效果.

  • webpack.config.js文件配置如下:

      //先安装htmlwebpackplugin npm install htmlwebpackplugin --save-dev
      var htmlWebpackPlugin = require('html-webpack-plugin');
      module.exports = {
      // context:上下文环境 = 根目录,
      entry: {
          main:'./src/js/main.js',
          bain: './src/js/bain.js'
      },
      output: {
          //输出路径
          path: './dist',
          //这里的[hash][chunkhash]指的其实就是版本号,MD5算法保证文件的唯一性
          filename: 'js/[name]-[chunkhash].js',
          //代码发布时的 地址
          publicPath: 'http://aili.com/'
      },
      
      plugins: [
          new htmlWebpackPlugin({
              // filename: 'index-[hash].html',filename: 'index-[chunkhash].html',生成后的文件名
              filename: 'index.html',
              //模板文件,就是项目根目录的index.html
              template: 'index.html',
              //将引入文件插入到哪里,body,head,false
              inject: 'body',
              title:'webpack is fuck',
              date: new Date(),
              //插件的参数: 删除注释空格之类的其他可以去插件官网找
              minify:{
                  removeComments:true,
                  collapseWhitespace: true
                  }
              })
          ]
      }
    

    htmlwebpackplugin
    htmlwebpackplugin.minify

多页面设置

分别有a.js,b.js,c.js

var htmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
// context:,
entry: {
    main:'./src/js/main.js',
    // bain: './src/js/bain.js',
    a: './src/js/a.js',
    b: './src/js/b.js',
    c: './src/js/c.js'
},
output: {
    path: './dist',
    filename: 'js/[name].js',
    publicPath: 'http://aili.com/'
},

plugins: [
    new htmlWebpackPlugin({
        // filename: 'index-[hash].html',
        filename: 'index.html',
        template: 'index.html',
        inject: 'body',
        title:'webpack is fuck',
        date: new Date(),
        minify:{
            removeComments:true,
            collapseWhitespace: true
        }
    }),
    new htmlWebpackPlugin({
        // filename: 'index-[hash].html',
        filename: 'a.html',
        template: 'index.html',
        // inject: 'body',
        inject: false,
        title:'This is a.html',
        //chunks:引用哪些js,这里用到的公用main.js和a.js
        chunks: ['main','a']
    }),
    new htmlWebpackPlugin({
        // filename: 'index-[hash].html',
        filename: 'b.html',
        template: 'index.html',
        // inject: 'body',
        inject: false,
        title:'This is b.html',
        chunks: ['main','b']
    }),
    new htmlWebpackPlugin({
        // filename: 'index-[hash].html',
        filename: 'c.html',
        template: 'index.html',
        // inject: 'body',
        inject: false,
        title:'This is c.html',
        chunks: ['main','c']
    }),
]
}

这里遇到一个问题,公用的main和对应的各个js不用htmlwebpackplugin.chunks怎么实现?

  • 可以自己配置个参数然后循环plugins判断是否是当前配置的参数

    new htmlWebpackPlugin({
    // filename: 'index-[hash].html',
    filename: 'a.html',
    template: 'index.html',
    inject: 'body',
    title:'This is a.html',
    //自定义参数
    isThat_a:true
    })
    然后再对应的文件下(这里是a.js)循环插件参数

    <% for(var key in htmlWebpackPlugin.options){%>
    <%= key%> : <%= JSON.stringify(htmlWebpackPlugin.options[key])%>
    if(isThat_a){<script type="text/javascript" src="<%= htmlWebpackPlugin.files.chunks.a.entry %>">
    </script>}
    <%}%>

Loaders

loader - Babel

loader使用方法 - 其中介绍了三种方法 require configuration cli.

  • require:

      require("./loader!./dir/file.txt");
      require("jade!./template.jade");
      require("!style!css!less!bootstrap/less/bootstrap.less");
    
  • configuration:

      {
          module: {
              loaders: [
                  { test: /\.jade$/, loader: "jade" },
                  // => "jade" loader is used for ".jade" files
                  { test: /\.css$/, loader: "style!css" },
                  // => "style" and "css" loader is used for ".css" files
                  // Alternative syntax:
                  { test: /\.css$/, loaders: ["style", "css"] },
              ]
          }
      }
    

    我用了第二种(configuration),先下载babel npm install babel--save-dev.更改配置文件

    Babel-官网插件 - 这里用到的插件presets.当然得先下载npm install babel-preset-latest(这里可以是2015 2016 2017 latest).

      var htmlWebpackPlugin = require('html-webpack-plugin');
      //引用nodejs自带的path模块
      var path = require('path');
      module.exports = {
      context:__dirname,
      entry: './src/app.js',
      output: {
          path: './dist',
          filename: 'js/[name].bundle.js',
      },
      module: {
          loaders:[
              {
                  //js
                  test:/\.js$/,
                  loader:'babel',
                  //tigao 打包速度
                  exclude:path.resolve(__dirname, "node_modules"),
                  //include:'./src',
                  query:{
                      presets:['latest']
                  }
              }
          }
      ]
      },
      plugins: [
      new htmlWebpackPlugin({
          // filename: 'index-[hash].html',
          filename: 'index.html',
          template: 'index.html',
          inject: 'body'
      })
      ]
      }
    

loader - css

  • npm install style-loader+css-loader+postcss-loader+autoprefixer --save-dev
    其中:

      loader: "style-loader!css-loader!'postcss-loader" ,
      loader:['style-loader','css-loader','postcss-loader'] //这两个写法一样
    

autoprefixer调用方法:在根目录下添加postcss.config.js文件或在webpack.config.js文件里增加postcss模块

    module.exports = {
    plugins: [
        require('autoprefixer')({ browsers: ["last 5 versions"] })
    ] 
    }
增加postcss模块

loader - less+sass

分别安装less sass

  • npm install less -save-dev

  • npm install less-loader --save-dev

    {
    test: /.less$/,
    loader: "style-loader!css-loader!postcss-loader!less-loader"
    }

loader - HTML

npm-install html-loader --save-dev

写个layer.js

import tpl from './layer.html';
import './layer.less';

function layer(){
    return {
        name:'layer',
        tpl:tpl
    };
    alert("Im layer");
}

export default layer;

layer.html

<div class="layer">
    <div>This is Layer!!!</div>
</div>

app.js(入口js)

import './css/common.css';
import layer from './components/layer/layer.js';
const App = function (){
    var dom = document.getElementById("app");
    var layer_r = new layer();
    dom.innerHTMl = layer_r;
}

new App();

然后直接在index.html中定义好用这个模块的加载点就ok.(<div id="app"></div>)
its work!! amazing man
[图片上传失败...(image-962629-1529468515878)]

loader - template

这里我用ejs模板 npm install ejs-loader --save-dev

{
    test: /\.tpl$/,   //这里可以自定义文件后缀,只用定义加载的模板文件即可
    loader: "ejs-loader"
}

layer.tpl

<div class="layer">
 <div>  this is the mustache-syntax - {{ this is the <%= name %> layer}}
<br/>
<% for(var i = 0;i<arr.length;i++) {%>
    <%= arr[i]%>
<%}%>
</div>
</div>

layer.js

import tpl from './layer.tpl';
import './layer.less';

function layer(){
    return {
        name:'layer',
        tpl:tpl
    };
    alert("Im layer");
}

export default layer;

app.js

import './css/common.css';
import layer from './components/layer/layer.js';
const App = function (){
    var dom = document.getElementById("app");
    var layer_r = new layer();
    dom.innerHTML=layer_r.tpl({         //这里对象里的值就是在 layer.js中定义的对象。
        name:'My name is Aili',  
        arr:['webpack','grunt','gulp']
    });
}

new App();

its work!!!


image

loader - image

图片有三种引用方式

  • 模板文件用 <img>
  • css - background
  • 还有index.html <img>
  • npm install file-loader --save-dev

webpack.config.js:

{
    test:/\.(png|jpg|gif|svg)$/i,
    loader:"file-loader"
}

模板文件用到的图片要做点处理:
本应是(<img src = "相对地址"> ---> <img src="${ require('相对地址') }" />)

最后优化图片加载 - file-loader(更改打包后文件的存放地址)+url-loader(转换为编码)+image-webpack-loader(压缩图片) 这三个配合使用效果更好。
so npm install 剩余的两个loader即可
所以最后配置文件变成了:

{
    test:/\.(png|jpg|gif|svg)$/,
    //url-loader的param: limit:图片压缩后大小超过1k,就转换成base64编码。
    loaders:["url-loader?limit:1000&name:assets/[name]-[hash:5].[ext]","image-webpack-loader"]
}

这只是打包和loader的基本配置,后续我在更新成开发环境的hot-reload等插件,webpack小白一枚。

代码地址

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

推荐阅读更多精彩内容