天行健, 君子以自强不息
Sunny's Blog
Title

what is webpack

这篇blog,希望读到的人可以理解webpack并且能简单上手。这里面重在理解。其次我要声明一个很重要的观点,webpack和grunt,gulp的出发点是不一样的,我会另外写一篇blog来进一步说明这个事。

0.Reference

先来参考的目的是如果不愿意看我的,你可以直接看参考文档

1.webpack官方文档

2.知乎很好的起步文档(1)(2)(3)

3.webpack和其他构建工具的比较

4.webpack github document

5.webpack-dev-server api

1.Install

webpack is a module bundler。module bundler的工作主要是项目文件打包,比如编译,合并,压缩等等工作。下面的图可以很清晰的说明。

全局安装webpack方法:npm install -g webpack

2.Simple demo(只讲部署的方式)

Step:

2-1.add entry.js

              document.write("hello webpack!");
            

2-2.add index.html

              <html>
                  <head>
                      <meta charset="utf-8">
                  </head>
                  <body>
                      <script type="text/javascript" src="bundle.js" charset="utf-8"></script>
                  </body>
              </html>
            

2-3.add main.css

              body {
                  background: red;
              }
            

2-4.add webpack.config.js

              module.exports = {
                  entry: "./entry.js",
                  output: {
                      path: __dirname,
                      filename: "bundle.js"
                  },
                  module: {
                      loaders: [
                        {
                          test: /\.css$/,
                          loaders: ['style', 'css']
                        }
                      ]
                  }
              };
            

2-5.run command

2-5-1.npm install css-loader style-loader --save-dev, 安装需要的loader

下面我提供一份package.json,你也可以通过npm init生成的(之后别忘了npm install)

              {
                "name": "webpack",
                "version": "1.0.0",
                "description": "",
                "main": "index.js",
                "scripts": {
                  "test": "echo \"Error: no test specified\" && exit 1",
                },
                "author": "",
                "license": "ISC",
                "devDependencies": {
                  "babel-core": "^6.21.0",
                  "babel-loader": "^6.2.10",
                  "babel-preset-es2015": "^6.18.0",
                  "css-loader": "^0.26.1",
                  "extract-text-webpack-plugin": "^1.0.1",
                  "file-loader": "^0.9.0",
                  "html-webpack-plugin": "^2.24.1",
                  "jquery": "^3.1.1",
                  "jshint": "^2.9.4",
                  "jshint-loader": "^0.8.3",
                  "moment": "^2.17.1",
                  "node-sass": "^4.1.0",
                  "sass-loader": "^4.1.0",
                  "style-loader": "^0.13.1",
                  "url-loader": "^0.5.7",
                  "webpack": "^1.14.0",
                  "webpack-dev-server": "^1.16.2"
                }
              }
            

2-5-2.webpack(默认执行 webpack.config.js)

2-5-3.webpack --progress --colors

If the project grows the compilation may take a bit longer. So we want to display some kind of progress bar. And we want colors…

2-5-4.webpack --progress --colors --watch

We don’t want to manually recompile after every change

3.Interface introduce

配置文件主要分为如下几块:

3-1.entry 入口文件

3-2.output 出口文件

3-3.module 模块,主要是loader要用什么不同的模块来处理各种类型的文件

3-4.plugins 插件,主要是提供合并压缩等工作,有点像task runner

webpack官方配置文档

4.Question

4-1.webpack/style-loader 是用来干什么的? 如果style-loader是将css插入到页面的style,那么外链的css样式应该如何写?

                style-loader to be transformed into a <style< tag.
                对于外链的css,
                需要用到如下的插件
                https://github.com/webpack/extract-text-webpack-plugin
                在config中主要配置如下:
                1)var ExtractTextPlugin = require("extract-text-webpack-plugin");
                2)  plugins: [
                    new ExtractTextPlugin("main.css"),
                3)  loaders: [
                      {
                        //test里面包含一个正则,包含需要匹配的文件
                        test: /\.scss$/, 
                        //注意loaders的处理顺序是从右到左的
                        loader: ExtractTextPlugin.extract(['css','sass']),
                        include: APP_PATH
                      },
                //去掉了style在loader中
            

4-2.source-map如何生效?

                1)config中配置devtool: 'source-map'
                2)对应的loader中配置['css?sourceMap', 'sass?sourceMap']
            

4-3.ajax如何配置

                用get请求直接访问,做统一端口,我已经放弃了代理
                $.ajax({
                    url: 'http://localhost:8080/app/api/test1.json',
                    type: 'GET',
                    dataType: 'json',
                    data: {param1: 'value1'},
                })
            

4-4.如何改变端口号

                参考:
                http://webpack.github.io/docs/webpack-dev-server.html#webpack-dev-server-cli
                devServer: {
                    port: 10007
                },
                配置port就可以了
            

4-5.templates变量没有生效?

                知乎网站上给的例子是错误的,正确的如下:
                在templates上:
                <title><%= htmlWebpackPlugin.options.title %></title>
                在config中对应部署:
                    new HtmlwebpackPlugin({
                        title: 'Hello World app'
                    })
                就可以读取出来了
            

4-6.你是看不到静态资源的,webpack通过loader将module生成了你看到的对应的静态资源?

                这个是不对的,可以看到静态资源,webpack通过loader生成了静态资源,你可以获取到。
            

4-7.jshint does not work

                我check了很长时间,不能工作的原因是不能用preLoader,要用postLoader,无语了我都
                下面是关键配置,
                    postLoaders: [
                      {
                        test: /\.jsx?$/,
                        exclude: /node_modules/, 
                        loader: 'jshint-loader'
                      }
                    ],

                  jshint: {
                    camelcase: true,
                    esnext: true,
                    quotmark: "single"
                  }
            
地势坤,君子以厚德载物