webpack使用教程 翻译自阮一峰(机翻)

原文https://github.com/ruanyf/webpack-demos#demo01-entry-file-source
这个仓库集合了一些webpack简单的demo。
这些demo风格简单明了,你将发现跟着这些案例学习webacpk这个强大的工具变得不费吹灰之力。

如何使用

首先,在全局环境中安装Webpackwebpack-dev-server

$ npm i -g webpack webpack-dev-server

然后将仓库克隆到本地并安装相关依赖

# Linux & Mac$ git clone git@github.com:ruanyf/webpack-demos.git
# Windows$ git clone https://github.com/ruanyf/webpack-demos.git
:
$ cd webpack-demos
$ npm install

现在,可以运行仓库中所有demo目录下的资源文件

$ cd demo01
$ webpack-dev-server

用你的浏览器访问 http://127.0.0.1:8080

前言:webpack是什么

webpack是一个前端构建系统类似于Grunt and Gulp.
它的功能有点类似于Browserify的模块包,但是它可以做的更多

$ browserify main.js > bundle.js
# 等价于
$ webpack main.js bundle.js

它的配置文件是webpack.config.js

// webpack.config.js
module.exports = {
  entry: './main.js',
  output: {
    filename: 'bundle.js'
  }
};

在有了webpack.config.js这个文件之后,你可以调用Webpack且不需要任何参数。

$ webpack

一些你应该知道的命令行选项

  • webpack– for building once for development(用于构建一个开发目录)
  • webpack -p– for building once for development(用于构建一个生产目录(压缩过的))
  • webpack --watch– for continuous incremental build(用于连续地构建)
  • webpack -d– to include source maps(展示映射关系)
  • webpack --colors– for making things pretty(用于美化展示的信息)

To produce a production ready application(为了产生生产准备的应用),你可以在package.json编写以下scripts字段

// package.json
{
  // ...
  "scripts": {
    "dev": "webpack-dev-server --devtool eval --progress --colors",
    "deploy": "NODE_ENV=production webpack -p"
  },
  // ...
}

Index


  1. Entry file
  2. Multiple entry files
  3. Babel-loader
  4. CSS-loader
  5. Image loader
  6. CSS Module
  7. UglifyJs Plugin
  8. HTML Webpack Plugin and Open Browser Webpack Plugin
  9. Environment flags
  10. Code splitting
  11. Code splitting with bundle-loader
  12. Common chunk
  13. Vendor chunk
  14. Exposing Global Variables
  15. Hot Module Replacement
  16. React router

Demo01:Entry file(入口文件) (资源)

Entry file(入口文件)将会被作为webpack读取并构造出bundle.js.
举例来说main.js就是一个(entry file)入口文件

// main.jsdocument.write('<h1>Hello World</h1>');

index.html

<html>
  <body>
    <script type="text/javascript" src="bundle.js"></script>
  </body>
<html>

webpack会根据webpack.config.js来构建出bundle.js

// webpack.config.js
module.exports = {
  entry: './main.js',
  output: {
    filename: 'bundle.js'
  }
};

启动服务器,访问 http://127.0.0.1:8080 .

$ webpack-dev-server

坑1

$ webpack-dev-server

运行代码出现以下错误意义不明

 http://localhost:8080/webpack-dev-server/
webpack result is served from /
content is served from C:\Users\umaru\demo\webpack-demos\demo01
Hash: 396f0bfb9d565b6f60f0
Version: webpack 1.14.0
Time: 44ms

ERROR in Entry module not found: Error: Cannot resolve 'file' or 'directory' ./main.js in C:\Users\umaru\demo\webpack-demos\demo01
webpack: bundle is now VALID.
$ webpack-dev-server
$ webpack --display-error-details//带上参数可以找出详细的错误信息
Hash: 396f0bfb9d565b6f60f0
Version: webpack 1.14.0
Time: 31ms

ERROR in Entry module not found: Error: Cannot resolve 'file' or 'directory' ./main.js in C:\Users\umaru\demo\webpack-demos\demo01
resolve directory
  C:\Users\umaru\demo\webpack-demos\demo01\main.js is not a directory (directory default file)
  C:\Users\umaru\demo\webpack-demos\demo01\main.js\package.json doesn't exist (directory description file)
resolve file
  C:\Users\umaru\demo\webpack-demos\demo01\main.js.webpack.js doesn't exist
  C:\Users\umaru\demo\webpack-demos\demo01\main.js.web.js doesn't exist
  C:\Users\umaru\demo\webpack-demos\demo01\main.js.js doesn't exist
  C:\Users\umaru\demo\webpack-demos\demo01\main.js.json doesn't exist
  resolve result C:\Users\umaru\demo\webpack-demos\demo01\main.js
  C:\Users\umaru\demo\webpack-demos\demo01\package.json (directory description file): SyntaxError: Unexpected token / in JSON at position 0

原因是json解析错误在第0行有注释json文件不认任何注释
修改package.json

{
  "scripts": {
    "dev": "webpack-dev-server --devtool eval --progress --colors",
    "deploy": "NODE_ENV=production webpack -p"
  }
}

再运行
$ webpack-dev-server

 http://localhost:8080/webpack-dev-server/
webpack result is served from /
content is served from C:\Users\umaru\demo\webpack-demos\demo01
Hash: fc2be4484e3356d26c56
Version: webpack 1.14.0
Time: 74ms
    Asset     Size  Chunks             Chunk Names
bundle.js  1.43 kB       0  [emitted]  main
chunk    {0} bundle.js (main) 40 bytes [rendered]
    [0] ./main.js 40 bytes {0} [built]
webpack: bundle is now VALID.

没有报错


Demo02: Multiple entry files (多入口文件)(资源)

多入口文件是合法的,它通常被应用于一个多页应用app

// main1.js
document.write('<h1>Hello World</h1>');
// main2.js
document.write('<h2>Hello Webpack</h2>');

index.html

<html>
  <body>
    <script src="bundle1.js"></script>
    <script src="bundle2.js"></script>
  </body>
<html>

webpack.config.js

module.exports = {
  entry: {
    bundle1: './main1.js',
    bundle2: './main2.js'
  },
  output: {
    filename: '[name].js'
  }
};

Demo03: Babel-loader(编译器可以将es6语法转成低版本[如es5语法]提高兼容性) (资源)

loaders(加载器)是可以转换您的应用程序资源(更多信息)文件的一个预处理器,例如Babel-loader可以将JSX / ES6文件转换为JS文件。官方文档有一个完整的 loaders(加载器)列表

main.jsx是一个 JSX 文件.

const React = require('react');
const ReactDOM = require('react-dom');

ReactDOM.render(
  <h1>Hello, world!</h1>,
  document.querySelector('#wrapper')
);

index.html

<html>
  <body>
    <div id="wrapper"></div>
    <script src="bundle.js"></script>
  </body>
</html>

webpack.config.js

module.exports = {
  entry: './main.jsx',
  output: {
    filename: 'bundle.js'
  },
  module: {
    loaders:[
      {
        test: /\.js[x]?$/,
        exclude: /node_modules/,
        loader: 'babel-loader?presets[]=es2015&presets[]=react'
      },
    ]
  }
};

webpack.config.js中,module.loaders字段用于分配加载程序。 上面的代码片段使用babel-loader,它还需要插件 babel-preset-es2015babel-preset-react对 ES6和React进行transpile(转义)。 您也可以使用其他方式设置babel配置选项。

module: {
  loaders: [
    {
      test: /\.jsx?$/,
      exclude: /node_modules/,
      loader: 'babel',
      query: {
        presets: ['es2015', 'react']
      }
    }
  ]
}

demo3 package.json

{
  "devDependencies": {
    "babel-core": "^6.21.0",
    "babel-loader": "^6.2.10",
    "babel-preset-es2015": "^6.18.0",
    "babel-preset-react": "^6.16.0",
    "react": "^15.4.2",
    "react-dom": "^15.4.2"
  }
}


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

推荐阅读更多精彩内容

  • 无意中看到zhangwnag大佬分享的webpack教程感觉受益匪浅,特此分享以备自己日后查看,也希望更多的人看到...
    小小字符阅读 8,154评论 7 35
  • webpack 介绍 webpack 是什么 为什么引入新的打包工具 webpack 核心思想 webpack 安...
    yxsGert阅读 6,461评论 2 71
  • GitChat技术杂谈 前言 本文较长,为了节省你的阅读时间,在文前列写作思路如下: 什么是 webpack,它要...
    萧玄辞阅读 12,685评论 7 110
  • 前言 webpack2和vue2已经不是新鲜东西了,满大街的文章在讲解webpack和vue,但是很多内容写的不是...
    技术宅小青年阅读 6,527评论 4 43
  • 生活中不如意的事十之八九,可总能发现有些人能够发现生活中的乐趣,我们给他定义为乐观。 其实乐观的人也会焦虑,只不过...
    水平生阅读 167评论 0 0