webpack的使用

这是一篇对webpack的使用介绍,里面的内容多是依据官网例子写出的,如有问题,欢迎指出。
参考:
https://segmentfault.com/a/1190000008159877
http://webpack.github.io/docs/

1、webpack介绍:

webpack是一种模块加载器兼打包工具,它能把各种资源,例如JS(含JSX)、coffee、样式(含less/sass)、图片等都作为模块来使用和处理。

  • 优势是:
  1. webpack 是以 commonJS 的形式来书写脚本滴,但对 AMD/CMD 的支持也很全面,方
    便旧项目进行代码迁移。
  2. 能被模块化的不仅仅是 JS 了。
  3. 开发便捷,能替代部分 grunt/gulp 的工作,比如打包、压缩混淆、图片转base64等。
  4. 扩展性强,插件机制完善

更多信息,请访问webpack官网

image.png

2、webpack的使用

a、安装webpack
npm i -g webpack
b-1、直接使用CommonJS规范来打包模块

这里我们使用官网的一个栗子

image.png

cats.js

var cats = ['dave', 'henry', 'martha'];
module.exports = cats;

app.js (Entry Point)

cats = require('./cats.js');
console.log(cats);

简单使用方式:
进入所在目录,直接在命令行输入:

webpack 需要打包的文件  打包后的文件名
image.png
image.png
b-2 复杂使用

前面的例子是对webpack最简单的使用介绍,接下来开始介绍webpack真正强大的功能,可以转换代码,设置捷径,添加插件等等。

  • 一、真实目录
    正如官网所言,真实项目中,我们会把不同功能的文件分文件夹放置,以便更好地管理。

Project structure
In real-world webpack projects, we’ll separate the source files from the bundled files by organizing them in folders. For example, we’ll put the source files in src, and bundled files in bin.

Our final project structure will look like this:

image.png

当然,结构不是固定的,这个根据我们实际项目而定。
接下来我们把各个文件移到相应目录。


image.png
  • 二、配置文件

随着我们文件结构,功能要求的复杂化,不可能所有功能都在command line完成,这时我们就需要一个配置表。

1、新建配置表文件webpack.config.js,一般格式如下:

module.exports = {
     entry: './src/app.js',//入口文件
     output: {//输出文件
         path: './bin',
         filename: 'app.bundle.js'
     }
 };

2、接下来我们开始运行,直接在command line输入 webpack即可,这样系统会自动从webpack.config.js开始运行。
然后我们运行后发现报错了。。。

image.png

这个错误是什么问题呢?
xxx is not a absolute path!
说明不是绝对路径,原因是webpack更新以后,写法不同了,官网并没有更新...
---我们稍作修改一下:

const path = require('path');
module.exports = {
    entry: './src/app.js',//入口文件
    output: {//输出文件
        path: path.resolve(__dirname, './bin'),
        filename: 'app.bundle.js'
    }
};

这次终于编译成功了。

image.png

打开app.bundle.js,我们看看到底webpack做了什么。

image.png
image.png

我们发现webpack是把所有依赖包的源文件都导入,再在模块里引用这些依赖包。这就是我们导入一个entry文件发生的事。

  • 三、Loaders
    Loaders是webpack一个很强大的功能,可以把浏览器原生不支持的代码格式( ES2015, CoffeeScript, TypeScript, etc.)转换成浏览器支持的格式,这样浏览器就可以直接拿来用了。

概括来说有两个目的:

  • 1、Identify what files should be transformed by a certain loader. (test property)
  • 2、Transform that file so that it can be added to your
    dependency graph (and eventually your bundle). (use property)

下面我们以一个es6的简单例子来看看webpack是怎么转换的。

开始使用:
1.Install Babel and the presets:

 npm install --save-dev babel-core
/*babel-core 的作用是把 js 代码分析成 ast ,方便各个插件分析语法进行相应的处理。
有些新语法在低版本 js 中是不存在的,如箭头函数,rest 参数,函数默认值等,
这种语言层面的不兼容只能通过将代码转为 ast,分析其语法后再转为低版本 js。
首先安装 babel-core。*/

你或许已经注意到了,目前为止通过运行 Babel 自己我们并没能“翻译”代码,而仅仅是把代码从一处拷贝到了另一处。
这是因为我们还没告诉 Babel 要做什么。
你可以通过安装插件(plugins)或预设(presets,也就是一组插件)来指示 Babel 去做什么事情。

 npm install --save-dev  babel-preset-es2015

预设 babel-preset 系列打包了一组插件,类似于餐厅的套餐。如 babel-preset-es2015 打包了 es6 的特性,babel-preset-stage-0 打包处于 strawman 阶段的语法
2.Install babel-loader:

 npm install --save-dev babel-loader

3.Configure Babel to use these presets by adding .babelrc

 { "presets": [ "es2015" ] }//告诉webpack转码规则是es2015

4.Modify webpack.config.js to process all .js files using babel-loader.

const path = require('path');
module.exports = {
    entry: './src/app.js',
    output: {
        path: path.resolve(__dirname, './bin'),
        filename: 'app.bundle.js',
    },
    module: {
        loaders: [{
            test: /\.js$/,
            exclude: /node_modules/,
            loader: 'babel-loader'
        }]
    }

We are excluding node_modules here because otherwise all external libraries will also go through Babel, slowing down compilation.

5.Install the libraries you want to use (in this example, jQuery):

 npm install --save jquery babel-polyfill

We are using --save instead of --save-dev this time, as these libraries will be used in runtime. We also use babel-polyfill so that ES2015 APIs are available in older browsers.

6.Edit src/app.js:

 import 'babel-polyfill';//import是es6语法
 import cats from './cats';
 import $ from 'jquery';//jquery是我们在polyfill导进来的
 $('<h1>Cats</h1>').appendTo('body');
 const ul = $('<ul></ul>').appendTo('body');
 for (const cat of cats) {
     $('<li></li>').text(cat).appendTo(ul);
 }

7.Bundle the modules using webpack:

 webpack
image.png

8.Add index.html so this app can be run in browser:

 <!DOCTYPE html>
 <html>
     <head>
         <meta charset="utf-8">
     </head>
     <body>
         <script src="bin/app.bundle.js" charset="utf-8"></script>
     </body>
 </html>

运行结果,登登登登

image.png
  • 四、plugin

webpack的功能可不止转换代码这么简单,还可以通过plugin实现各种各样的功能,下面演示一下通过plugin来压缩代码

这是我们刚刚创建的文件。


image.png

配置webpack.config.js

const path = require('path');
const webpack = require('webpack');

module.exports = {
    entry: './src/app.js',
    output: {
        path: path.resolve(__dirname, './bin'),
        filename: 'app.bundle.js',
    },
    module: {
        loaders: [{
            test: /\.js?$/,
            exclude: /node_modules/,
            loader: 'babel-loader',
        }]
    },
    plugins: [
        new webpack.optimize.UglifyJsPlugin({
            compress: {
                warnings: false,
            },
            output: {
                comments: false,
            },
        }),
    ]
}

The Uglify plugin 是webpack内置的,不需要另外添加模块

压缩后,deng、deng、deng、deng~!!

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

推荐阅读更多精彩内容