zoukankan      html  css  js  c++  java
  • webpack使用手册


    安装

    //全局安装
    npm install -g webpack
    //安装到你的项目目录
    npm install --save-dev webpack

     

    正式使用Webpack前的准备

    在终端中使用npm init命令可以自动创建这个package.json文件

    npm init

    package.json文件已经就绪,我们在本项目中安装Webpack作为依赖包

    // 安装Webpack
    npm install --save-dev webpack

    Webpack配置文件

    module.exports = {
      entry:  __dirname + "index.js",//已多次提及的唯一入口文件
      output: {
        path: __dirname + "/dist",//打包后的文件存放的地方
        filename: "bundle.js"//打包后输出文件的文件名
      }
    }

    更快捷的执行打包任务

    在package.json中对npm的脚本部分进行相关设置即可,设置方法如下。

    {
      "name": "webpack-sample-project",
      "version": "1.0.0",
      "description": "",
      "scripts": {
        "start": "webpack" //配置的地方就是这里啦,相当于把npm的start命令指向webpack命令
      },
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "webpack": "^1.12.9"
      }
    }

    npm的start是一个特殊的脚本名称,它的特殊性表现在,在命令行中使用npm start就可以执行相关命令,如果对应的此脚本名称不是start,想要在命令行中运行时,需要这样用npm run {script name}npm run build

    Webpack的强大功能

    生成Source Maps(使调试更容易)

    devtool选项 配置结果
    source-map 在一个单独的文件中产生一个完整且功能完全的文件。这个文件具有最好的source map,但是它会减慢打包文件的构建速度;
    cheap-module-source-map 在一个单独的文件中生成一个不带列映射的map,不带列映射提高项目构建速度,但是也使得浏览器开发者工具只能对应到具体的行,不能对应到具体的列(符号),会对调试造成不便;
    eval-source-map 使用eval打包源文件模块,在同一个文件中生成干净的完整的source map。这个选项可以在不影响构建速度的前提下生成完整的sourcemap,但是对打包后输出的JS文件的执行具有性能和安全的隐患。不过在开发阶段这是一个非常好的选项,但是在生产阶段一定不要用这个选项;
    cheap-module-eval-source-map 这是在打包文件时最快的生成source map的方法,生成的Source Map 会和打包后的JavaScript文件同行显示,没有列映射,和eval-source-map选项具有相似的缺点;

    eval-source-map是一个很好的选项,不过记得只在开发阶段使用它,继续上面的例子,进行如下配置

    module.exports = {
      devtool: 'eval-source-map',//配置生成Source Maps,选择合适的选项
      entry:  __dirname + "/app/main.js",
      output: {
        path: __dirname + "/public",
        filename: "bundle.js"
      }
    }

    使用webpack构建本地服务器

    npm install --save-dev webpack-dev-server

    devserver作为webpack配置选项中的一项,具有以下配置选项

    devserver配置选项 功能描述
    contentBase 默认webpack-dev-server会为根文件夹提供本地服务器,如果想为另外一个目录下的文件提供本地服务器,应该在这里设置其所在目录(本例设置到“public"目录)
    port 设置默认监听端口,如果省略,默认为”8080“
    inline 设置为true,当源文件改变时会自动刷新页面
    colors 设置为true,使终端输出的文件为彩色的
    historyApiFallback 在开发单页应用时非常有用,它依赖于HTML5 history API,如果设置为true,所有的跳转将指向index.html

    继续把这些命令加到webpack的配置文件中

    module.exports = {
      devtool: 'eval-source-map',
    
      entry:  __dirname + "/app/main.js",
      output: {
        path: __dirname + "/public",
        filename: "bundle.js"
      },
    
      devServer: {
        contentBase: "./public",//本地服务器所加载的页面所在的目录
        colors: true,//终端中输出结果为彩色
        historyApiFallback: true,//不跳转
        inline: true//实时刷新
      } 
    }

    Loaders

    通过使用不同的loader,webpack通过调用外部的脚本或工具可以对各种各样的格式的文件进行处理,比如说分析JSON文件并把它转换为JavaScript文件,或者说把下一代的JS文件(ES6,ES7)转换为现代浏览器可以识别的JS文件。

    Loaders需要单独安装并且需要在webpack.config.js下的modules关键字下进行配置,Loaders的配置选项包括以下几方面:

    • test:一个匹配loaders所处理的文件的拓展名的正则表达式(必须)
    • loader:loader的名称(必须)
    • include/exclude:手动添加必须处理的文件(文件夹)或屏蔽不需要处理的文件(文件夹)(可选);
    • query:为loaders提供额外的设置选项(可选)
    //安装可以装换JSON的loader
    npm install --save-dev json-loader
    module.exports = {
      devtool: 'eval-source-map',
    
      entry:  __dirname + "/app/main.js",
      output: {
        path: __dirname + "/public",
        filename: "bundle.js"
      },
    
      module: {//在配置文件里添加JSON loader
        loaders: [
          {
            test: /.json$/,
            loader: "json"
          }
        ]
      },
    
      devServer: {
        contentBase: "./public",
        colors: true,
        historyApiFallback: true,
        inline: true
      }
    }

    Babel

    • 下一代的JavaScript标准(ES6,ES7),这些标准目前并未被当前的浏览器完全的支持;
    • 使用基于JavaScript进行了拓展的语言,比如React的JSX

    Babel其实是几个模块化的包,其核心功能位于称为babel-core的npm包中,不过webpack把它们整合在一起使用,但是对于每一个你需要的功能或拓展,你都需要安装单独的包(用得最多的是解析Es6的babel-preset-es2015包和解析JSX的babel-preset-react包)。

    // npm一次性安装多个依赖模块,模块之间用空格隔开
    npm install --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react
    module.exports = {
      devtool: 'eval-source-map',
    
      entry:  __dirname + "/app/main.js",
      output: {
        path: __dirname + "/public",
        filename: "bundle.js"
      },
    
      module: {
        loaders: [
          {
            test: /.json$/,
            loader: "json"
          },
          {
            test: /.js$/,
            exclude: /node_modules/,
            loader: 'babel',//在webpack的module部分的loaders里进行配置即可
            query: {
              presets: ['es2015','react']
            }
          }
        ]
      },
    
      devServer: {
        contentBase: "./public",
        colors: true,
        historyApiFallback: true,
        inline: true
      }
    }

    Babel的配置选项

     ".babelrc" 的配置文件,webpack会自动调用.babelrc里的babel配置选项

    //.babelrc
    {
      "presets": ["react", "es2015"]
    }

    CSS

    webpack提供两个工具处理样式表,css-loader 和 style-loader,二者处理的任务不同,css-loader使你能够使用类似@import 和 url(...)的方法实现 require()的功能,style-loader将所有的计算后的样式加入页面中,二者组合在一起使你能够把样式表嵌入webpack打包后的JS文件中。

    //安装
    npm install --save-dev style-loader css-loader
    //使用
    module.exports = {
      devtool: 'eval-source-map',
    
      entry:  __dirname + "/app/main.js",
      output: {
        path: __dirname + "/build",
        filename: "bundle.js"
      },
    
      module: {
        loaders: [
          {
            test: /.json$/,
            loader: "json"
          },
          {
            test: /.js$/,
            exclude: /node_modules/,
            loader: 'babel'
          },
          {
            test: /.css$/,
            loader: 'style!css'//添加对样式表的处理
          }
        ]
      },
    
      devServer: {...}
    }

    注:感叹号的作用在于使同一文件能够使用不同类型的loader

    CSS module

    module.exports = {
      devtool: 'eval-source-map',
    
      entry:  __dirname + "/app/main.js",
      output: {...},
    
      module: {
        loaders: [
          {
            test: /.json$/,
            loader: "json"
          },
          {
            test: /.js$/,
            exclude: /node_modules/,
            loader: 'babel'
          },
          {
            test: /.css$/,
            loader: 'style!css?modules'//跟前面相比就在后面加上了?modules
          }
        ]
      },
    
      devServer: {...}
    }

    CSS预处理器

    • Less Loader
    • Sass Loader
    • Stylus Loader

    首先安装postcss-loader 和 autoprefixer(自动添加前缀的插件)

    npm install --save-dev postcss-loader autoprefixer
    //webpack配置文件
    module.exports = {
      devtool: 'eval-source-map',
      entry: __dirname + "/app/main.js",
      output: {...},
    
      module: {
        loaders: [
          {
            test: /.json$/,
            loader: "json"
          },
          {
            test: /.js$/,
            exclude: /node_modules/,
            loader: 'babel'
          },
          {
            test: /.css$/,
            loader: 'style!css?modules!postcss'
          }
        ]
      },
    
      postcss: [
        require('autoprefixer')//调用autoprefixer插件
      ],
    
      devServer: {...}
    }

    插件(Plugins)

    使用插件的方法

    要使用某个插件,我们需要通过npm安装它,然后要做的就是在webpack配置中的plugins关键字部分添加该插件的一个实例(plugins是一个数组)继续看例子,我们添加了一个实现版权声明的插件。

    //webpack.config.js
    var webpack = require('webpack');
    
    module.exports = {
      devtool: 'eval-source-map',
      entry:  __dirname + "/app/main.js",
      output: {...},
    
      module: {
        loaders: [
          { test: /.json$/, loader: "json" },
          { test: /.js$/, exclude: /node_modules/, loader: 'babel' },
          { test: /.css$/, loader: 'style!css?modules!postcss' }//这里添加PostCSS
        ]
      },
      postcss: [
        require('autoprefixer')
      ],
    
      plugins: [
        new webpack.BannerPlugin("Copyright Flying Unicorns inc.")//在这个数组中new一个就可以了
      ],
    
      devServer: {...}
    }

    HtmlWebpackPlugin

    这个插件的作用是依据一个简单的模板,帮你生成最终的Html5文件,这个文件中自动引用了你打包后的JS文件。每次编译都在文件名中插入一个不同的哈希值。

    npm install --save-dev html-webpack-plugin

    Hot Module Replacement

    Hot Module Replacement(HMR)也是webpack里很有用的一个插件,它允许你在修改组件代码后,自动刷新实时预览修改后的效果。

    //webpack中的配置
    var webpack = require('webpack');
    var HtmlWebpackPlugin = require('html-webpack-plugin');
    
    module.exports = {
      devtool: 'eval-source-map',
      entry: __dirname + "/app/main.js",
      output: {
        path: __dirname + "/build",
        filename: "bundle.js"
      },
    
      module: {
        loaders: [
          { test: /.json$/, loader: "json" },
          { test: /.js$/, exclude: /node_modules/, loader: 'babel' },
          { test: /.css$/, loader: 'style!css?modules!postcss' }
        ]
      },
      postcss: [
        require('autoprefixer')
      ],
    
      plugins: [
        new HtmlWebpackPlugin({
          template: __dirname + "/app/index.tmpl.html"
        }),
        new webpack.HotModuleReplacementPlugin()//热加载插件
      ],
    
      devServer: {
        colors: true,
        historyApiFallback: true,
        inline: true,
        hot: true
      }
    }

    安装react-transform-hmr

    npm install --save-dev babel-plugin-react-transform react-transform-hmr

    配置Babel

    {
      "presets": ["react", "es2015"],
      "env": {
        "development": {
        "plugins": [["react-transform", {
           "transforms": [{
             "transform": "react-transform-hmr",
    
             "imports": ["react"],
    
             "locals": ["module"]
           }]
         }]]
        }
      }
    }

    产品阶段的构建

    目前为止,我们已经使用webpack构建了一个完整的开发环境。但是在产品阶段,可能还需要对打包的文件进行额外的处理,比如说优化,压缩,缓存以及分离CSS和JS。

    对于复杂的项目来说,需要复杂的配置,这时候分解配置文件为多个小的文件可以使得事情井井有条,以上面的例子来说,我们创建一个“webpack.production.config.js”的文件,在里面加上基本的配置,它和原始的webpack.config.js很像,如下

    优化插件

    • OccurenceOrderPlugin :为组件分配ID,通过这个插件webpack可以分析和优先考虑使用最多的模块,并为它们分配最小的ID
    • UglifyJsPlugin:压缩JS代码;
    • ExtractTextPlugin:分离CSS和JS文件

    我们继续用例子来看看如何添加它们,OccurenceOrder 和 UglifyJS plugins 都是内置插件,你需要做的只是安装它们

    npm install --save-dev extract-text-webpack-plugin
    var webpack = require('webpack');
    var HtmlWebpackPlugin = require('html-webpack-plugin');
    var ExtractTextPlugin = require('extract-text-webpack-plugin');
    
    module.exports = {
      entry: __dirname + "/app/main.js",
      output: {
        path: __dirname + "/build",
        filename: "bundle.js"
      },
    
      module: {
        loaders: [
          {
            test: /.json$/,
            loader: "json"
          },
          {
            test: /.js$/,
            exclude: /node_modules/,
            loader: 'babel'
          },
          {
            test: /.css$/,
            loader: ExtractTextPlugin.extract('style', 'css?modules!postcss')
          }
        ]
      },
      postcss: [
        require('autoprefixer')
      ],
    
      plugins: [
        new HtmlWebpackPlugin({
          template: __dirname + "/app/index.tmpl.html"
        }),
        new webpack.optimize.OccurenceOrderPlugin(),
        new webpack.optimize.UglifyJsPlugin(),
        new ExtractTextPlugin("style.css")
      ]
    }

    缓存

    webpack可以把一个哈希值添加到打包的文件名中,使用方法如下,添加特殊的字符串混合体([name], [id] and [hash])到输出文件名前

    var webpack = require('webpack');
    var HtmlWebpackPlugin = require('html-webpack-plugin');
    var ExtractTextPlugin = require('extract-text-webpack-plugin');
    
    module.exports = {
      entry: __dirname + "/app/main.js",
      output: {
        path: __dirname + "/build",
        filename: "[name]-[hash].js"
      },
    
      module: {
        loaders: [
          {
            test: /.json$/,
            loader: "json"
          },
          {
            test: /.js$/,
            exclude: /node_modules/,
            loader: 'babel'
          },
          {
            test: /.css$/,
            loader: ExtractTextPlugin.extract('style', 'css?modules!postcss')
          }
        ]
      },
      postcss: [
        require('autoprefixer')
      ],
    
      plugins: [
        new HtmlWebpackPlugin({
          template: __dirname + "/app/index.tmpl.html"
        }),
        new webpack.optimize.OccurenceOrderPlugin(),
        new webpack.optimize.UglifyJsPlugin(),
        new ExtractTextPlugin("[name]-[hash].css")
      ]
    }
    var path = require('path');
    var webpack = require('webpack');
    /*
    extract-text-webpack-plugin插件,
    有了它就可以将你的样式提取到单独的css文件里,
    再也不用担心样式会被打包到js文件里了。
     */
    var ExtractTextPlugin = require('extract-text-webpack-plugin');
    /*
    html-webpack-plugin插件,重中之重,webpack中生成HTML的插件,
    具体可以去这里查看https://www.npmjs.com/package/html-webpack-plugin
     */
    var HtmlWebpackPlugin = require('html-webpack-plugin');
    
    module.exports = {
        entry: { //配置入口文件,有几个写几个
            index: './src/js/page/index.js',
            list: './src/js/page/list.js',
            about: './src/js/page/about.js',
        },
        output: { 
            path: path.join(__dirname, 'dist'), //输出目录的配置,模板、样式、脚本、图片等资源的路径配置都相对于它
            publicPath: '/dist/',               //模板、样式、脚本、图片等资源对应的server上的路径
            filename: 'js/[name].js',           //每个页面对应的主js的生成配置
            chunkFilename: 'js/[id].chunk.js'   //chunk生成的配置
        },
        module: {
            loaders: [ //加载器,关于各个加载器的参数配置,可自行搜索之。
                {
                    test: /.css$/,
                    //配置css的抽取器、加载器。'-loader'可以省去
                    loader: ExtractTextPlugin.extract('style-loader', 'css-loader') 
                }, {
                    test: /.less$/,
                    //配置less的抽取器、加载器。中间!有必要解释一下,
                    //根据从右到左的顺序依次调用less、css加载器,前一个的输出是后一个的输入
                    //你也可以开发自己的loader哟。有关loader的写法可自行谷歌之。
                    loader: ExtractTextPlugin.extract('css!less')
                }, {
                    //html模板加载器,可以处理引用的静态资源,默认配置参数attrs=img:src,处理图片的src引用的资源
                    //比如你配置,attrs=img:src img:data-src就可以一并处理data-src引用的资源了,就像下面这样
                    test: /.html$/,
                    loader: "html?attrs=img:src img:data-src"
                }, {
                    //文件加载器,处理文件静态资源
                    test: /.(woff|woff2|ttf|eot|svg)(?v=[0-9].[0-9].[0-9])?$/,
                    loader: 'file-loader?name=./fonts/[name].[ext]'
                }, {
                    //图片加载器,雷同file-loader,更适合图片,可以将较小的图片转成base64,减少http请求
                    //如下配置,将小于8192byte的图片转成base64码
                    test: /.(png|jpg|gif)$/,
                    loader: 'url-loader?limit=8192&name=./img/[hash].[ext]'
                }
            ]
        },
        plugins: [
            new webpack.ProvidePlugin({ //加载jq
                $: 'jquery'
            }),
            new webpack.optimize.CommonsChunkPlugin({
                name: 'vendors', // 将公共模块提取,生成名为`vendors`的chunk
                chunks: ['index','list','about'], //提取哪些模块共有的部分
                minChunks: 3 // 提取至少3个模块共有的部分
            }),
            new ExtractTextPlugin('css/[name].css'), //单独使用link标签加载css并设置路径,相对于output配置中的publickPath
    
            //HtmlWebpackPlugin,模板生成相关的配置,每个对于一个页面的配置,有几个写几个
            new HtmlWebpackPlugin({ //根据模板插入css/js等生成最终HTML
                favicon: './src/img/favicon.ico', //favicon路径,通过webpack引入同时可以生成hash值
                filename: './view/index.html', //生成的html存放路径,相对于path
                template: './src/view/index.html', //html模板路径
                inject: 'body', //js插入的位置,true/'head'/'body'/false
                hash: true, //为静态资源生成hash值
                chunks: ['vendors', 'index'],//需要引入的chunk,不配置就会引入所有页面的资源
                minify: { //压缩HTML文件    
                    removeComments: true, //移除HTML中的注释
                    collapseWhitespace: false //删除空白符与换行符
                }
            }),
            new HtmlWebpackPlugin({ //根据模板插入css/js等生成最终HTML
                favicon: './src/img/favicon.ico', //favicon路径,通过webpack引入同时可以生成hash值
                filename: './view/list.html', //生成的html存放路径,相对于path
                template: './src/view/list.html', //html模板路径
                inject: true, //js插入的位置,true/'head'/'body'/false
                hash: true, //为静态资源生成hash值
                chunks: ['vendors', 'list'],//需要引入的chunk,不配置就会引入所有页面的资源
                minify: { //压缩HTML文件    
                    removeComments: true, //移除HTML中的注释
                    collapseWhitespace: false //删除空白符与换行符
                }
            }),
            new HtmlWebpackPlugin({ //根据模板插入css/js等生成最终HTML
                favicon: './src/img/favicon.ico', //favicon路径,通过webpack引入同时可以生成hash值
                filename: './view/about.html', //生成的html存放路径,相对于path
                template: './src/view/about.html', //html模板路径
                inject: true, //js插入的位置,true/'head'/'body'/false
                hash: true, //为静态资源生成hash值
                chunks: ['vendors', 'about'],//需要引入的chunk,不配置就会引入所有页面的资源
                minify: { //压缩HTML文件    
                    removeComments: true, //移除HTML中的注释
                    collapseWhitespace: false //删除空白符与换行符
                }
            }),
    
            new webpack.HotModuleReplacementPlugin() //热加载
        ],
        //使用webpack-dev-server,提高开发效率
        devServer: {
            contentBase: './',
            host: 'localhost',
            port: 9090, //默认8080
            inline: true, //可以监控js变化
            hot: true, //热启动
        }
    };

    本文学习自:

    入门Webpack,看这篇就够了

  • 相关阅读:
    OSGi for C/C++
    Tizen NPPlugin开发
    Trove4j
    [Tizen]某些目录下存放的东西
    OpenMobile's Application Compatibility Layer (ACL)
    params
    页面无法访问
    websevice 服务前台和后台
    SQL 创建存储过程
    UpdatePanel
  • 原文地址:https://www.cnblogs.com/smss/p/6562311.html
Copyright © 2011-2022 走看看