環境是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的打包。
