-
Notifications
You must be signed in to change notification settings - Fork 0
/
webpack.config.js
136 lines (119 loc) · 5.02 KB
/
webpack.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
//先清空 n-build 文件夹下的文件
var fs = require('fs'),buildPath='./build/';
var folder_exists = fs.existsSync(buildPath);
if(folder_exists == true)
{
var dirList = fs.readdirSync(buildPath);
dirList.forEach(function(fileName)
{
fs.unlinkSync(buildPath + fileName);
});
console.log("clearing " + buildPath);
};
//readfile 异步读取
//先把index.html里面关于style和js的hash值都删除掉,避免在使用 npm run dev 的时候,路径还是压缩后的路劲
fs.readFile("index.html",'utf-8',function(err,data){
if(err){
console.log("error");
}else{
//将index.html里面的hash值清除掉
var devhtml = data.replace(/((?:href|src)="[^"]+\.)(\w{20}\.)(js|css)/g, '$1$3');
fs.writeFileSync('index.html', devhtml);
}
});
var webpack = require('webpack');
//var vue = require("vue-loader");
//混淆压缩
var uglifyJsPlugin = webpack.optimize.UglifyJsPlugin;
//检测重用模块
var CommonsChunkPlugin = webpack.optimize.CommonsChunkPlugin;
//独立样式文件
var ExtractTextPlugin = require("extract-text-webpack-plugin");
// 在命令行 输入 “PRODUCTION=1 webpack --progress” 就会打包压缩,并且注入md5戳 到 index.html里面
var production = process.env.PRODUCTION;
var plugins = [
//会将所有的样式文件打包成一个单独的style.css
new ExtractTextPlugin( production ? "style.[hash].css" : "style.css" , {
disable: false//,
//allChunks: true //所有独立样式打包成一个css文件
}),
//new ExtractTextPlugin("[name].css" )
//自动分析重用的模块并且打包成单独的文件
new CommonsChunkPlugin(production ? "vendor.[hash].js" : "vendor.js" ),
function(){
return this.plugin('done', function(stats) {
var content;
//这里可以拿到hash值 参考:http://webpack.github.io/docs/long-term-caching.html
content = JSON.stringify(stats.toJson().assetsByChunkName, null, 2);
console.log('版本是:'+JSON.stringify(stats.toJson().hash));
//return fs.writeFileSync('build/assets.json', content);
});
}
];
//发布编译时,压缩,版本控制
if (process.env.PRODUCTION) {
//压缩
plugins.push(new webpack.optimize.UglifyJsPlugin({compress: {warnings: false } }));
}
/*
版本控制
package.json中的
"html-webpack-plugin": "^1.6.2",
模块是把生成的带有md5戳的文件,插入到index.html中。
通过index.tpl模板,生成 index.html
*/
var HtmlWebpackPlugin = require("html-webpack-plugin");
//HtmlWebpackPlugin文档 https://www.npmjs.com/package/html-webpack-plugin
//https://github.com/ampedandwired/html-webpack-plugin/issues/52
plugins.push( new HtmlWebpackPlugin({
filename:'../index.html',//会生成index.html在根目录下,并注入脚本
template:'index.tpl',
inject:true //此参数必须加上,不加不注入
}));
module.exports = {
entry: ["./src/app.js"],
output: {
path: "./build",
/*
publicPath路径就是你发布之后的路径,
比如你想发布到你站点的/util/vue/build 目录下, 那么设置
publicPath: "/util/vue/build/",
此字段配置如果不正确,发布后资源定位不对,比如:css里面的精灵图路径错误
*/
publicPath: "/build/",
filename: production ? "build.[hash].js" : "build.js"//"build.[hash].js"//[hash]MD5戳 解决html的资源的定位可以使用 webpack提供的HtmlWebpackPlugin插件来解决这个问题 见:http://segmentfault.com/a/1190000003499526 资源路径切换
},
module: {
preLoaders:[
// {
// //代码检查
// test:/\.js$/,exclude:/node_modules/,loader:'jshint-loader'
// }
],
loaders: [
// 加载vue组件,并将css全部整合到一个style.css里面
// 但是使用这种方式后 原先可以在vue组件中 在style里面加入 scoped 就不能用了,
// 好处是使用了cssnext,那么样式按照标准的来写就行了,会自动生成兼容代码 http://cssnext.io/playground/
{
test: /\.vue$/,
loader: 'vue'
},
{test: /\.css$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader?sourceMap!cssnext-loader")},
{test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192'}, // 内联 base64 URLs, 限定 <=8k 的图片, 其他的用 URL
{test: /\.woff$/, loader: "url?limit=10000&minetype=application/font-woff"},
{test: /\.ttf$/, loader: "file"},
{test: /\.eot$/, loader: "file"},
{test: /\.svg$/, loader: "file"}
]
},
vue:{
css:ExtractTextPlugin.extract("style-loader",
"css-loader?sourceMap!cssnext-loader")
},
plugins : plugins,
devtool: 'source-map'//,
// resolve: {
// // 现在可以写 require('file') 代替 require('file.coffee')
// extensions: ['', '.js', '.json', '.coffee','vue']
// }
};