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

 

posted on 2018-03-12 16:46  Phoebeli  阅读(2276)  评论(0编辑  收藏  举报