学习webpack原来就是SoEasy

Webpack

在前端大行其道的时代,不管是传统PC端应用,还是日益备受青睐的MobileAPP,功能越来越丰富,用户体验越来越好,必然导致业务逻辑越来越复杂,代码越来越多,客户端加载也是越来越慢。为了解决这些问题,便出现了如火如荼的模块化和一系列前端优化工具,webpack就是优化工具其中之一。

webpack是当下最热门的前端资源模块化管理和打包工具。它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。本文就简单介绍webpack的基本使用和config配置。

前提:windows下nodenpm环境已经配置OK,cmd命令行node -vnpm -v都能正常显示版本。

安装


  • 全局安装
    npm i -g webpack
  • 项目跟目录下创建package.json文件
    npm init    //执行命令后一路enter键就OK
  • 项目根目录下安装webpack包依赖
    npm i webpack --save-dev
  • 示例目录结构:

      demo/                       根目录
          app/                    打包前的资源文件
              entry.js            entry.js是入口文件
              b.js                b.js是entry.js中引用的一个模块
              css/                css文件资源
                  style.css       style.css是entry.js中引用的css
                  reset.css       reset.css是style.css中@import的公共样式
          build/                  打包后的文件存放的文件夹
          node_modules/           npm的依赖包
          index.html              调试展现的页面
          package.json            项目的基本信息、依赖包的版本
    
  • entry.js

    // 引入app.js
    var str = require('./b.js');
    // 引入外部样式表
    // 没有配置config的加载css的写法
    /*require('!style-loader!css-loader!./css/style.css');*/
    // 配置config之后的写法
    require('./css/style.css');
    document.body.innerHTML = '<h1>'+str+'</h1>';
  • b.js
    module.exports = 'zmnaer.com';
  • style.css
    h1{
        color: #f00;
        font-size: 40px;
    }
  • reset.css
    *{
        margin: 0;
        padding: 0;
    }
    body{
        background: #eee;
    }
  • 执行打包
    webpack app/entry build/build.js

执行结束后就会在build文件夹中生成打包后的build.js


webpack的config配置

在根目录下新建webpack-config.js,之后可在命令中直接输入webpack执行打包。

  • 配置
    var webpack = require('webpack');
    var path = require('path');
    module.exports = {
        entry:'./app/entry.js', // 输出文件入口
        output:{    // 输出路径
            path:__dirname, // 取得当前目录路径
            filename:'./build/build.js' // 输出文件路径、文件名
        },
        module:{    // 加载模块插件
            loaders:[   // 加载器 插件
                {
                    test:/\.css$/,  // 正则匹配css文件
                    loader:['style-loader','css-loader'],   // style css 加载器,顺序不能颠倒,有依赖关系
                    exclude:'/node_module/' // 排除的文件夹
                    /*include:'/app/'       // 多个就用数组*/
                }
            ]
        },
        resolve:{
            extensions:['','.css','.js','.jsx']
        },
        plugins:[   //插件
            new webpack.BannerPlugin('This file is created by auto')
        ]
    };

一、entry入口文件

  • entry配置
    1. 只有一个入口文件时:是一个字符串,如:entry:'./app/entry.js'
    2. 有两个及以上入口文件时:是一个对象
      • a. 是数组时,是将多个模块打包成一个模块。依赖性最高的放在最后,如:entry:["./app/a.js",".app/b.js"]
      • b. 是键值对时,是需要分别打包多个模块,如:
    entry:{
        module1:'./app/a.js',
        module2:'./app/b.js',
    }

二、loaders(加载器)

在commonJS、AMD、CMD规范下,前端编程逐渐趋向模块化。因此在开发过程中,模块化不仅仅只加载js模块,css、json等模块也同样运用此方法加载。
而webpack默认只能加载js资源文件,如果想要加载其他文件资源,需要用到各种加载器。

1、style-loader和css-loader

加载外联css文件

  • 安装

      npm i --save-dev style-loader css-style
    
  • 配置

      loaders:{
          test:/\.css$/,
          loader:'style-loader!css-loader?modules'
      }
    

2、json-loader

加载json文件

  • 安装

      npm i --save-dev json-loader
    
  • 配置

      loaders:{
          test:/\.json$/,
          loader:'json-loader'
      }
    

3、babel-loader

编译ES6的js文件以及react编译加载

  • 安装

      npm i --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react
      npm i --save-dev react react-dom
    
  • 配置

      loader:{
          test:/\.js$/,
          loader:"babel-loader",
          exclude:"/node_modules/",
          query:{
              presets:["es2015","react"]
          }
      }
    
  • 注意:项目根目录必须创建.babelrc文件,内容如下:

      {"presets":["es2015"]}
    

4、postcss-loader和autoprefixer(自动添加前缀的插件)

  • 安装

      npm i --save-dev postcss-loader autoprefixer
    
  • 配置

      loaders:{
          test:/\.css$/,
          loader:"style-loader!css-loader?module!postcss"
      },
      postcss:{
          require('autoprefixer') //调用autoprefixer插件
      }
    

三、plugins(插件)

1、HtmlWebpackPlugin

  • 这个插件可以帮助生成HTML,并且与打包后的build.js文件同目录。配置:
    plugins: [new HtmlWebpackPlugin()]

2、BannerPlugin

  • 这个插件能在打包后的js文件开头位置增加一个头注释。配置:
    plugins:[new webpack.BannerPlugin('webpack file by zm.')]
  • 更多请参考:官网Plugins

四、webpack-dev-server

webpack-dev-server是一个轻量级的服务器,修改文件源码后,自动刷新页面将修改同步到页面上。

  • 安装
    npm i webpack-dev-server -g // 全局安装
    npm i webpack-dev-server --save-dev // 项目根目录下安装
    webpack命令参数:
  • 编译的输出内容带有进度和颜色
    webpack-dev-server --progress --color
  • 启动监听模式并自动打包
    webpack-dev-server --watch
  • 设置端口号
    webpack-dev-server --port 8080
  • 热加载并自动刷新
    webpack-dev-server --hot --inline
  • 使用另一份配置文件(比如webpack.es6.config.js)来打包
    webpack --config webpack.es6.config.js
  • 压缩混淆脚本
    webpack -p
  • 生成map映射文件
    webpack -d
  • 使用webpack命令打包时,默认是根据webpcak.config.js配置文件进行打包。有时因为开发需求,可能会配置多个不同的config.js文件进行不同的操作,如:webpack.es6.config.jswebpack.react.config.js,这样在执行操作的时候会添加以下参数:
    webpack --config webpack.es6.config.js // 针对es6语法
    webpack --config webpack.react.config.js // 针对react

五、package.json命令配置

  • 如果在命令行中要输入以下类似命令:
    1)webpack-dev-server --port 3000 --hot --inline
    2)webpack-dev-server --port 3000 --hot --inline --config webpack.es6.config.js
    3)webpack-dev-server --port 3000 --hot --inline --config webpack.react.config.js
    每次打包或启动都要输入这么老长的命令,不免觉得过于繁琐,因此可在package.json中的script下配置相关属性值:

      "script":{
          "test": "echo \"Error: no test specified\" && exit 1",      // 默认
          "build":"webpack-dev-server --port 3000 --hot --inline",       // 1
          "build-es6":"webpack-dev-server --port 3000 --hot --inline --config webpack.es6.config.js",      // 2
          "build-react":"webpack-dev-server --port 3000 --hot --inline --config webpack.react.config.js"      // 3
      }
    

之后就可以在命令行中输入短小精悍的命令执行相关操作:
1. npm run build
2. npm run build-es6
3. npm run build-react


提示:iinstall的简写,推荐使用

  • 参考文档:
  1. http://webpack.github.io/docs/
  2. https://webpack.js.org/
  3. http://webpackdoc.com/
  4. http://www.cnblogs.com/haogj/p/5160821.html
  5. http://www.jb51.net/article/96646.htm
  • 不甚详细,多多包涵 -O=O-

欢迎访问:个人博客地址

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

推荐阅读更多精彩内容