webpack2配置

详细的配置可以参考官网:https://doc.webpack-china.org/guides/

一开始做项目时都是直接从组里前辈搭建好的脚手架开始写代码,到后来自己写新项目时又是拷贝之前的工程作为脚手架开始。对于脚手架本身却不甚了解,不仅不思考为什么更是没有改进的想法,怪不得工作满一年了却总觉得自己的技术水平在原地踏步,就是没有总结和思考。

目前组里的技术栈都是使用vue+koa,使用webpack的好处一是方便写vue的单文件组件,二是打包文件方便生产部署再加上能无所顾虑的应用语言的新特性。

1. 配置文件

官方文档推荐写webpack配置文件时,先写出一个基本配置文件包含入口、输出等,再根据开发/生产环境所需要插件的不同,利用webpack-merge生成两个配置文件。

package.json 依赖参考

"devDependencies": {
    "babel-core": "^6.25.0",
    "babel-loader": "^7.1.1",
    "css-loader": "^0.28.4",
    "less": "^2.7.2",
    "less-loader": "^4.0.4",
    "style-loader": "^0.18.2",
    "vue-loader": "^13.0.0",
    "webpack": "^3.0.0",
    "webpack-chunk-hash": "^0.4.0",
    "webpack-dev-server": "^2.5.0",
    "webpack-manifest-plugin": "^1.1.2",
    "webpack-merge": "^4.1.0"
  }

webpack.config.base.js

 1 const path = require(‘path‘);
 2 const webpack = require(‘webpack‘);
 3 const WebpackManifestPlugin = require("webpack-manifest-plugin");
 4 const WebpackChunkHash = require("webpack-chunk-hash");
 5
 6 module.exports = {
 7     entry: {
 8         index: ‘./app/src/index.js‘,
 9     },
10     output: {
11         path: path.resolve(__dirname, ‘..‘, ‘app‘, ‘public‘, ‘js‘)
12     },
13     resolve: {
14         alias: {
15             ‘vue$‘: path.resolve(__dirname, ‘../node_modules/vue/dist/vue.js‘),
16         }
17     },
18     module: {
19         loaders: [
20             {
21                 test: /\.vue$/,
22                 loader: ‘vue-loader‘,
23             },
24             {
25                 test: /\.js$/,
26                 exclude: /node_modules/,
27                 loader: ‘babel-loader‘,
28             },
29             {
30                 test: /\.css$/,
31                 use: [ ‘style-loader‘, ‘css-loader‘ ]
32             },
33             {
34                 test: /\.less$/,
35                 loader: "style!css!less"
36             }
37         ]
38     },
39     plugins: [
40         new WebpackManifestPlugin(),
41         new webpack.optimize.CommonsChunkPlugin({
42             name: ‘vendor‘,
43             minChunks: function (module) {
44                 // this assumes your vendor imports exist in the node_modules directory
45                 return module.context && module.context.indexOf(‘node_modules‘) !== -1;
46             }
47         }),
48         //CommonChunksPlugin will now extract all the common modules from vendor and main bundles
49         new webpack.optimize.CommonsChunkPlugin({
50             name: ‘manifest‘ //But since there are no more common modules between them we end up with just the runtime code included in the manifest file
51         }),
52         new WebpackChunkHash(),
53     ],
54 }

第15行代码可以参考这里这里,默认NPM包导出的是运行时构建,Vue2的运行时构建不支持单文件组件的template

第40行的 WebpackManifestPlugin 作用是将输出文件名保存在文件中 (当输出文件名带 chunkhash 时很有用,参考这里)

第41、49行的 CommonsChunkPlugin 作用是从打包后的 bundle 文件中提取公共模块,将 npm install 的公共模块和业务代码分开,这样浏览器就可以一直缓存公共模块的bundle,参考这里

第52行的 WebpackChunkHash 作用是让文件名的哈希值基于文件内容

webpack.config.dev.js

 1 const path = require(‘path‘);
 2 const webpack = require(‘webpack‘);
 3 const Merge = require(‘webpack-merge‘);
 4 const baseConfig = require(‘./webpack.config.base.js‘);
 5
 6 module.exports = Merge(baseConfig, {
 7     output: {
 8         filename: ‘[name].js‘,
 9     },
10     devtool: ‘#eval-source-map‘,
11     plugins: [
12         new webpack.HotModuleReplacementPlugin()
13     ],
14     devServer: {
15         port: 7002,
16         hot: true
17     }
18 });

第10行设置source-map,方便用浏览器查看源代码

第12、14行主要用于使用下面会提到的webpack-dev-server

webpack.config.prod.js

 1 const webpack = require(‘webpack‘);
 2 const Merge = require(‘webpack-merge‘);
 3 const baseConfig = require(‘./webpack.config.base.js‘);
 4
 5 module.exports = Merge(baseConfig, {
 6     output: {
 7         filename: ‘[name].[chunkhash].js‘,
 8     },
 9     plugins: [
10         new webpack.optimize.UglifyJsPlugin({
11             compress: {
12                 warnings: false
13             }
14         })
15     ]
16 });

第10行 UglifyJsPlugin 的作用是压缩、混淆代码

webpack的配置文件自定义程度很高,所以在参考他人配置时最好能弄清楚为什么要这样写

2. webpack-dev-server 

在开发过程中另一个重要的东西是 webpack-dev-server,它的作用是当你改动源代码后能自动重新打包,再加上 webpack 的HMR-模块热替换特性,这样改动代码就能直接在浏览器里看到效果,省却了代码手动打包+刷新浏览器的步骤。使用 webpack-dev-server 有 CLI 和 API 两种使用方法。

CLI 也就是我目前所用的方法,需要设置好配置文件,参考上面的 dev 文件中的 HotModuleReplacementPlugin 和 devServer 设置:devServer 的port 为 webpack-dev-server 运行的端口,hot 设置和 HotModuleReplacementPlugin 启用 HMR。启动的命令为:

node_modules/.bin/webpack-dev-server --config ./config/webpack.config.dev.js

然后通过 http://localhost:7002/index.js 就能获取到打包后对应的文件内容,注意文件是在内存,端口和文件名参考配置文件。

要想在网页中引用打包后的文件可以通过后端使用 nunjucks 之类的模板将文件地址注入到网页中,这里有好几个需要注意的地方。

一个是打包后的 bundle 文件需要注意引入的顺序,公共模块文件要先引入进来,我的开发环境引入顺序为:

<script src="http://localhost:7002/manifest.js"></script>
<script src="http://localhost:7002/vendor.js"></script>
<script src="http://localhost:7002/index.js"></script>

否则会报 ReferenceError: webpackJsonp is not defined 错误

二是注意要有 .babelrc 文件:

{
    "presets": ["es2015"]
}

否则会报 SyntaxError: Unexpected token: name (xxxxxx) from Uglify plugin 之类的错误,无法识别语言新特性

三是在生成环境中,由于输出文件的文件名带 chunkhash,会随着文件内容的改变而改变,所以需要在后端读取 manifest.json 文件的内容,并将文件名通过 nunjucks 之类的模板引擎注入到网页中。当然可以不使用 chunkhash,这样就可以将文件名在网页里写死了,但这样就不方便利用到浏览器的缓存。

API 方法的使用可参考 这里 和 这里

3. webpack-dev-middleware

当使用 express、koa 之类的后端框架时可以利用 webpack-dev-middleware,通过中间件来实现热加载。具体使用方法:这里

时间: 2024-10-11 22:26:05

webpack2配置的相关文章

webpack2的配置属性说明entry,output,state,plugins,node,module,context

Webpack2配置属性详解 webpack说明 webpack是前端构建的一个核心所在,如果说后端构建就是把高级语言代码编译成机器码,那么前端的构建就是重新组合原有的代码,虽然并不编译成机器码,但实际上,因为前端长期使用简单的脚本开发,HTML,CSS,JS互相分离,难以形成类似工程化的"凝聚力". 所以伴随着大量的模块化标准的建立,"组件化"前端的概念也逐渐确立,前端开始着重以功能模块为划分,而不是和以前一般以代码种类为划分. webpack是很好的构建解决方案

vue文件单独打包css

单独打包需要使用extract-text-webpack-plugin插件: 我用的[email protected]这个版本,webpack用的webpack2 配置如下: 1.先定义      const ExtractTextPlugin = require('extract-text-webpack-plugin'); 2.配置css和less { test: /\.css$/, use: ExtractTextPlugin.extract({ fallback:'style-loade

webpack2.0配置postcss-loader

安装postcss-loader npm install --save-dev postcss-loader 配置webpack.config.js { test:/\.css$/, use:[ 'style-loader', 'css-loader?importLoaders=1', 'postcss-loader' ] } 一种办法是配置postcss.config.js module.exports = { plugins: [ require('autoprefixer')({ /* .

webpack2.0+ vue2.0

一 webpack 2.0 及用到的插件安装(默认已经有node环境) 1. package.json文件 (插件安装及插件的功能不详解) { "private": true, "devDependencies": { "autoprefixer-loader": "^3.2.0", "babel-core": "^6.18.2", "babel-loader": &

webpack1.x 升级到 webpack2.x 英文文档翻译

近日项目要升级到webpack2.2,原来使用的webpack版本是1.12,在升级项目的同时,翻译一下官方的升级文档,去掉了一些不常用的配置. resolve.root, resolve.fallback,resolve.modulesDirectories, ,这三个选项现在全部合并到resolve.modules一个选项中.关于resolving,查看更多   resolve.extensions 这个配置项不再强制要求传入一个空字符串,这个行为被移动到了resolve.enforceEx

webpack2学习日志

webpack说容易也容易,说难也难,主要还是看个人,想学到什么样的程度,很多公司可能要求仅仅是会用就行,但是也有一些公司要求比较高,要懂一些底层的原理,所以还是要花一些时间的,看个人需求.这篇仅仅是做了一些总结,都是来自官网,便于复习. 一,先理解webpack的概念: 官网上:webpack 是一个现代 JavaScript 应用程序的模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用

webpack2.x基础属性讲解(一)

webpack作为构建工具平时作为前端作为优化.模块编程.和分片打包的重要组成部分,大家可能并不陌生,如果没有时刻的去关注文档,那么大家可能不太清楚webpack已经默默然的升级到2.x了,对比1.x版本,webpack2的文档结构和代码提示都非常友善. webpack从1.x升到2版,并没有作为大的更改改动,而且内部的接口文档形式也与1基本无修改,那么对比webpack2版本 我们对webpack的主要属性做个简单的属性讲解 首先第一个 webpack2.1后对声明引入webpack省略了 ,

webpack配置这一篇就够

最近看了一篇好文,根据这个文章重新梳理了一遍webpack打包过程,以前的一些问题也都清楚了,在这里分享一下,同时自己也做了一些小的调整 原文链接:http://www.jianshu.com/p/42e11515c10f git项目地址:https://github.com/gengchen528/webpackSample 更多前端内容可以到:http://www.bloggeng.com/ 写在前面的话 阅读本文之前,先看下面这个webpack的配置文件,如果每一项你都懂,那本文能带给你的

webpack2.0 基本使用

1, 新建文件夹webpack, npm init –y 快速创建一个package.json 文件.新建src和build 文件夹,分别存放源代码和打包后的代码. 2, 安装webpack. webpack 的安装方式有两种:全局安装 和 本地安装. 全局安装: npm install webpack –g, 之后就可以在命令行中使用webpack 命令,如果我们想打包src里面的文件,就可以在命令行中直接输入 webpack src/index.js  build/index.js 进行打包