一. 号称 require Anything 。打包各类各样的文件css
// 好比你有一个index.js文件。你就能够在这个文件里面require其余的文件 var _mytools = require('util/mytools.js'); require('./index.less');
二. 模块化开发,结构层次清晰html
// 好比你能够在body标签里面引入其余的html文件 <%= require('html-loader!./layout/nav.html') %>
三. 牛逼的插件和各类各样的loadernode
如 webpack-dev-server, 能够实时监控效果 babel-loader , 能够转换es6语法到es5......
上面的介绍,很垃圾,彻底不足以描述webpack的功能。jquery
一. 配置别名webpack
// 配置别名 之后就能够直接引用该位置 以下面的page 之后就能够直接require('page/..') resolve: { alias: { node_modules:__dirname + '/node_modules', page:__dirname + '/src/page', } }
二. 咱们须要指定打包文件的入口 entry.es6
// 我习惯把全部的入口文件 都放在src/page页面 entry: { 'common' : ['./src/page/common/index.js'], 'index' : ['./src/page/index/index.js'], 'list' : ['./src/page/list/index.js'] },
三. 指定生成的文件的存放位置 output.web
output: { // 路径 path: __dirname + '/dist/', // 访问路径 publicPath:'/dist/' // 文件名 filename: 'js/[name].js' },
四. 利用loader处理各类各样的文件json
module: { loaders: [ // 1. js文件处理 利用webpack自带的js处理功能. babel处理出来的对ie支持很差 // 2. css,less,stylus... 加载顺序:从下到上,从又到左 // css-loader 处理css里面的 url // style-loader 将css插入到页面的style标签 // ExtractTextPlugin 单独打包css样式,以避免打包在js里面致使样式错乱 // 个人webpack版本是1.* 注意下less和less-loader的版本, 我用的都是2.*的 { test : /\.(less|css)$/, loader: ExtractTextPlugin.extract('style', 'css!less') }, // 3. 图片的处理 // 小于8K的图片将直接以base64的形式内联在代码中,能够减小一次http请求。 // 大于8k的呢?则直接file-loader打包, 这里并无写明file-loader.可是确实是须要安装,不然会有问题.而name也是file-loader的属性 { test: /\.(woff|woff2|eot|ttf|svg|jpg|png|gif)\??.*$/, loader: 'url-loader', query: { limit: 8192, name: 'resourse/[name].[ext]' } }, // 4. 这个我本身配置的 用于hogan.js的template { test: /\.string$/, loader: 'html-loader', query : { // 须要压缩 minimize : true, // 压缩的时候 不要删除引号 removeAttributeQuotes : false } } ] }
5. 插件的应用babel
var webpack = require('webpack'); var ExtractTextPlugin = require("extract-text-webpack-plugin"); var HtmlWebpackPlugin = require('html-webpack-plugin'); // 默认会把全部入口节点的公共代码提取出来,生成一个common.js,可是我指定他生成base.js new webpack.optimize.CommonsChunkPlugin({ name: 'common', filename: 'js/base.js' }), // 把css单独打包到文件里 new ExtractTextPlugin("css/[name].css"), // 自动生成html文件 而且引入相对的js文件 new HtmlWebpackPlugin ({ // 模板文件路径 template : './src/view/'+name+'.html', // 输出文件名以及路径 dist/view/ filename : 'view/'+name+'.html', // 生成title标签 也能够<title><%= htmlWebpackPlugin.options.title%></title> title : title, // 有true body script标签位于html文件的 body 底部 // head 放在head里面 // false 不生产js文件 inject : true, // 给生成的 js 文件一个独特的 hash 值 hash : true, // 能够看到咱们的入口有不少js文件 chunks会默认引用全部的 可是明显咱们不须要 // 咱们只须要引入本身单独须要的js文件name.js 和 通用的 common.js chunks : ['common',name], // 给生成的 html 文件生成一个 favicon图标 通常放在更目录下 favicon : './favicon.ico' })
// 实际上一个个去写 太麻烦了 用函数的方式来 var getHtmlConfig = function(name,title) { return { template : './src/view/'+name+'.html', filename : 'view/'+name+'.html', title : title, inject : true, hash : true, chunks : ['common',name], favicon : './favicon.ico' } } new HtmlWebpackPlugin(getHtmlConfig('index', '首页')),
6. 生产环境 和 线上环境 , 以及 webpack-dev-serverless
// 环境变量设置 var WEBPACK_ENV = process.env.WEBPACK_ENV || 'dev'; // 若是是在生产环境 就在通用组件common里面加入webpack-dev-server/client?http://localhost:80/ if('dev' === WEBPACK_ENV){ config.entry.common.push('webpack-dev-server/client?http://localhost:80/'); } // 而后,在package.json的scripts加上 { "dev_mac" : "WEBPACK_ENV=dev webpack-dev-server --inline --port 80", "dev_win" : "set WEBPACK_ENV=dev && webpack-dev-server --inline --port 80", "dist_mac": "WEBPACK_ENV=online webpack-dev-server -p", "dist_win": "set WEBPACK_ENV=online && webpack -p" } // 还能够继续更改output的配置 publicPath: 'dev' === WEBPACK_ENV ? '/dist/' : '//..线上地址../dist/'
7. 库 和 各类插件的引用
// jquery的引入 // 咱们能够设置一个footer.html 用来描述页面的底部 // 而后在footer.html的最下面引入jquery <script src="https://cdn.bootcss.com/jquery/1.12.0/jquery.js"></script> // 在webpack里面配置 这样能够require 可是又不会被编译 externals: { 'jquery':'window.jQuery' },
// 插件的引用 // 如上图 插件unslider 必备的js代码 和 美化css 都经过index.js引入. // 引用的时候, 就能够var slider = require("util/slider/index.js") $('.banner').unslider({ speed: 500, // 速度 delay: 3000, // 延时 complete: function() {}, // 结束回调 keys: true, // 左右箭头 dots: true, // 下面的小圆点 fluid: false // 支持响应设计。可能会破坏没有响应的设计 });