环境是webpack 3,sass(.scss)
添加前缀需要用到的是sass-loader, posscss-loader, autoprefixer, css-loader。
webpack中的配置:
{
test:/\.scss$/,
loader:ExtractTextPlugin.extract({
use:['css-loader?minimize','postcss-loader','sass-loader']
}),
exclude:/node_modules/
}
我的项目中是需要在html中插入css文件的,所以是上面的写法。
postcss-loader默认会读取根目录下的postcss.config.js
postcss.config.js文件中的内容:
module.exports = {
plugins: [
require('autoprefixer')
]
};
需要在package.json中配置
"browserslist": [
"Firefox > 20",
"iOS >= 7",
"ie >= 8",
"last 5 versions",
"> 5%"
]
browserlist的配置参考:
https://github.com/ai/browserslist#queries
问题:
上面的配置,如果没有写Firefox >20则,生成的css文件,没有-moz-前缀了,因为firfox已经支持最新的css3了,并且已经超过了5个版本。
加上之后会有三个前缀,-webkit-, -moz-, -ms-
css3 浏览器的兼容性
http://www.runoob.com/cssref/css3-browsersupport.html
webpack.config.js
const webpack = require('webpack');
const WebpackDevServer = require("webpack-dev-server");
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const WebpackChunkHash = require("webpack-chunk-hash");
const CommonsChunkPlugin = webpack.optimize.CommonsChunkPlugin;
const UglifyJsPlugin = webpack.optimize.UglifyJsPlugin;
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const CleanPlugin = require('clean-webpack-plugin'); //清理文件夹
function resolve(file){
return path.resolve(__dirname, file)
}
module.exports = {
// devtool:'eval-source-map',
entry:{
app:resolve('./src/app.js'),
vendor:['vue','vue-router','vuex']
},
output:{
path:resolve('./dist/'),
filename:'[name].js?v=[hash]',
publicPath:'/dist/',
//chunkFilename:'chunks/[name].js?v=[chunkhash:8]'
},
resolve:{
extensions:['.vue','.js'],
alias:{
'vue$':'vue/dist/vue.common.js'
}
},
plugins:[
//清空输出目录
//new CleanPlugin(['chunks'], {
// "root": resolve('./dist'),
// verbose: true,
// dry: false
//}),
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"'
}
}),
new UglifyJsPlugin({
sourceMap:false,
compress:{
warnings:false
}
}),
new CommonsChunkPlugin({
name:['vendor','manifest'],
minChunks: Infinity
}),
new HtmlWebpackPlugin({
template:resolve('./src/index.template.html'),
filename:resolve('./index.html'),
inject:'body',
// chunks:['app','vendor','runtime']
chunks:['manifest','app','vendor'],
hash: false,
}),
new ExtractTextPlugin({
filename:'bundle.css?v=[hash]',
allChunks:true,
disable:false,
publicPath:'/dist'
}),
//new WebpackChunkHash(),
//new webpack.HashedModuleIdsPlugin()
],
module:{
rules:[
{
test:/\.vue$/,
loader:'vue-loader',
exclude:/node_modules/
},{
test:/\.js$/,
loader:'babel-loader?cacheDirectory',
exclude:/node_modules/,
options:"{presets:[['es2015', { modules:false }]]}"
},{
test:/\.scss$/,
loader:ExtractTextPlugin.extract({
use:['css-loader?minimize','postcss-loader','sass-loader']
}),
exclude:/node_modules/
},{
test:/\.css$/,
loader:ExtractTextPlugin.extract({
use:['css-loader?minimize']
})
},
{
test: /\.(eot|svg|ttf|woff|woff2)(\?\S*)?$/,
loader: 'file-loader'
},
{
test: /\.(png|jpe?g|gif|svg)(\?\S*)?$/,
loader: 'file-loader',
query: {
name: '[name].[ext]?[hash]'
}
}
]
}
}
webpack.dev.js,这个
const webpack = require('webpack');
const WebpackDevServer = require("webpack-dev-server");
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const WebpackChunkHash = require("webpack-chunk-hash");
const CommonsChunkPlugin = webpack.optimize.CommonsChunkPlugin;
const UglifyJsPlugin = webpack.optimize.UglifyJsPlugin;
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const CleanPlugin = require('clean-webpack-plugin'); //清理文件夹
function resolve(file){
return path.resolve(__dirname, file)
}
module.exports = {
devtool:'eval-source-map',
entry:{
app:resolve('./src/app.js'),
vendor:['vue','vue-router','vuex']
},
output:{
path:resolve('./dist/'),
filename:'[name].js?v=[hash]',
publicPath:'/dist/',
//chunkFilename:'chunks/[name].js?v=[chunkhash:8]'
},
resolve:{
extensions:['.vue','.js'],
alias:{
'vue$':'vue/dist/vue.common.js'
}
},
plugins:[
//清空输出目录
//new CleanPlugin(['chunks'], {
// "root": resolve('./dist'),
// verbose: true,
// dry: false
//}),
new UglifyJsPlugin({
sourceMap:true,
compress:{
warnings:false
}
}),
new CommonsChunkPlugin({
name:['vendor','manifest'],
minChunks: Infinity
}),
new HtmlWebpackPlugin({
template:resolve('./src/index.template.html'),
filename:resolve('./index.html'),
inject:'body',
// chunks:['app','vendor','runtime']
chunks:['manifest','app','vendor']
}),
new ExtractTextPlugin({
filename:'bundle.css?v=[hash]',
allChunks:true,
disable:false,
publicPath:'/dist'
}),
//new WebpackChunkHash(),
//new webpack.HashedModuleIdsPlugin()
new webpack.HotModuleReplacementPlugin()
],
module:{
rules:[
{
test:/\.vue$/,
loader:'vue-loader',
exclude:/node_modules/
},{
test:/\.js$/,
loader:'babel-loader?cacheDirectory',
exclude:/node_modules/,
options:"{presets:[['es2015', { modules:false }]]}"
},{
test:/\.scss$/,
loader:ExtractTextPlugin.extract({
use:['css-loader?minimize','sass-loader']
}),
exclude:/node_modules/
},{
test:/\.css$/,
loader:ExtractTextPlugin.extract({
use:['css-loader?minimize']
})
},
{
test: /\.(eot|svg|ttf|woff|woff2)(\?\S*)?$/,
loader: 'file-loader'
},
{
test: /\.(png|jpe?g|gif|svg)(\?\S*)?$/,
loader: 'file-loader',
query: {
name: '[name].[ext]?[hash]'
}
}
]
},
devServer: {
historyApiFallback: true,
contentBase: "./",
publicPath: '/dist/',
compress: true,
quiet: false, //控制台中不输出打包的信息
noInfo: false,
hot: true, //开启热点
inline: true, //开启页面自动刷新
lazy: false, //不启动懒加载
progress: true, //显示打包的进度
host: 'xxx.com',
port: '8090', //设置端口号
//其实很简单的,只要配置这个参数就可以了
proxy: {
'/aaa/*': {
target: 'http://ccc.com:6080/',
secure: false
}
}
}
}
其中包括Babel的打包。