美文网首页
Webpack+React+多语言(三) 插件配置

Webpack+React+多语言(三) 插件配置

作者: 抓住时间的尾巴吧 | 来源:发表于2017-04-25 11:25 被阅读98次
    • 多语言的实现了,现在安装我们一般所需要的插件

    1.sass、scss、less编译

    因为sass-loader依赖于node-sass,所以还要安装node-sass
    当然了,使用样式的话,css-loader和style-loader也是必须的依赖包

    • css-loader使你能够使用类似@import 和 url(…)的方法实现 require()的功能;
    • style-loader将所有的计算后的样式加入页面中;
      二者组合在一起使你能够把样式表嵌入webpack打包后的JS文件中。
    npm install --save-dev less
    npm install --save-dev less-loader
    npm install --save-dev sass
    npm install --save-dev sass-loader
    npm install --save-dev node-sass
    npm install --save-dev css-loader
    npm install --save-dev style-loader
    npm install --save-dev extract-text-webpack-plugin
    npm install --save-dev postcss-loader
    npm install --save-dev precss
    npm install --save-dev autoprefixer
    
    1. 自动补全css3前缀:autoprefixer
    实际代码
    a { display: flex}
    插件补全之后
    a { 
        display: -webkit-box; 
        display: -webkit-flex; 
        display: -ms-flexbox; 
        display: flex
    }
    npm install --save-dev autoprefixer postcss-loader
    var autoprefixer = require('autoprefixer');
    module.exports={ 
        //其他配置这里就不写了 
        module:{ 
            loaders:[ 
                { test:/\.css$/, loaders:['style-loader','css-loader','postcss-loader'] } 
            ] 
        }, 
        postcss:[autoprefixer({browsers:['last 2 versions']})]
    }
    
    1. 自动生成html插件:html-webpack-plugin
    npm install html-webpack-plugin --save-dev
    /webpack.config.js 
    var HtmlWebpackPlugin = require('html-webpack-plugin'); 
    module.exports={
        entry:'./index.js', 
        output:{ path:__dirname+'/dist', filename:'bundle.js' } 
        plugins: [ 
            new HtmlWebpackPlugin({ 
                title: 'My App', 
                filename: 'admin.html', 
                template:'header.html', 
                inject: 'body', 
                favicon:'./images/favico.ico', 
                minify:true, 
                hash:true, 
                cache:false, 
                showErrors:false, 
                "chunks": { 
                    "head": { 
                        "entry": "assets/head_bundle.js", 
                        "css": [ "main.css" ] 
                    },
                     xhtml:false 
                })
            ]
    }
    

    title: 设置title的名字
    filename: 设置这个html的文件名
    template:要使用的模块的路径
    inject: 把模板注入到哪个标签后 'body',
    favicon: 给html添加一个favicon './images/favico.ico',
    minify:是否压缩 {...} | false (最新api变动,原来是ture|false 感谢@onmi指正)
    hash:是否hash化 true false ,
    cache:是否缓存,
    showErrors:是否显示错误,
    chunks:目前没太明白
    xhtml:是否自动毕业标签 默认false

    1. 提取样式插件:extract-text-webpack-plugin
      说明:将css放到index.html的body上面
    var ExtractTextPlugin = require("extract-text-webpack-plugin");
    module.exports = { 
        module: { 
            loaders: [ 
                { test: /\.css$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader") } 
            ] 
        }, 
        plugins: [ 
            new HtmlWebpackPlugin({ template: './src/public/index.html', inject: 'body' }), 
            new ExtractTextPlugin("[name].[hash].css") 
        ]
    }
    
    1. 拷贝资源插件:copy-webpack-plugin
    cnpm install --save-dev copy-webpack-plugin
    new CopyWebpackPlugin([{ 
        from: __dirname + '/src/public'
    }]),
    作用:把public 里面的内容全部拷贝到编译目录
    

    | 参数 | 作用 |其他说明 |
    | ------------- |-------------|-------------|
    | from |定义要拷贝的源目录|from: __dirname + '/src/public'|
    |to |定义要烤盘膛的目标目录 |from: __dirname + '/dist' |
    |toType | file 或者 dir|可选,默认是文件 |
    |force |强制覆盖先前的插件 | 可选 默认false|
    | context|不知道作用 | 可选 默认 base context 可用 specific context|
    | flatten| 只拷贝文件不管文件夹| 默认是false|
    |ignore | 忽略拷贝指定的文件|可以用模糊匹配 |

    1. 全局挂载插件:webpack.ProvidePlugin [webpack内置插件 ]
    new webpack.ProvidePlugin({ $: "jquery", jQuery: "jquery", "window.jQuery": "jquery"}))
    new webpack.NoErrorsPlugin(),
    new webpack.optimize.DedupePlugin(),
    new webpack.optimize.UglifyJsPlugin(),
    new webpack.optimize.CommonsChunkPlugin('common.js')
    

    作用,和上面5个一一对应
    当模块使用这些变量的时候,wepback会自动加载。(区别于window挂载,感谢@lihuanghe121指正)
    不显示错误插件
    查找相等或近似的模块,避免在最终生成的文件中出现重复的模块
    丑化js 混淆代码而用
    提取公共代码的插件

    调试技巧

    if (isTest) { config.devtool = 'inline-source-map';}
    作用: 使用source-map可以在debug的时候看到源代码,方便 查错
    

    这里我还没想好怎么整理,比较混乱

    用sass编写的样式也打包 转换成css 的时候也是单独的一个css 文件
    npm install --save-dev extract-text-webpack-plugin 
    npm install --save-dev sass-loader
    var ExtractTextPlugin = require('extract-text-webpack-plugin');
    编写loaders:{ test: /.sass$/, loader: ExtractTextPlugin.extract('style', 'css!sass')}
    第二个参数执行顺序:从右到左
    npm install css-loader --save-dev
    npm install less-loader --save-dev
    npm install sass-loader --save-dev
    npm install style-loader --save-dev
    npm install url-loader --save-dev
    

    一个完整的栗子

    'use strict';
    // Modules
    var webpack = require('webpack');
    var autoprefixer = require('autoprefixer');
    var HtmlWebpackPlugin = require('html-webpack-plugin');
    var ExtractTextPlugin = require('extract-text-webpack-plugin');
    var CopyWebpackPlugin = require('copy-webpack-plugin');
    /**
     * Env
     * Get npm lifecycle event to identify the environment
     */
    var ENV = process.env.npm_lifecycle_event;
    var isTest = ENV === 'test' || ENV === 'test-watch';
    var isProd = ENV === 'build';
    module.exports = function makeWebpackConfig() {
        var config = {};
        config.entry = isTest ? {} : {
            app: './src/app/app.js'
        };
        config.output = isTest ? {} : {
            // Absolute output directory
            path: __dirname + '/dist',
            publicPath: isProd ? '/' : 'http://localhost:8080/',
            filename: isProd ? '[name].[hash].js' : '[name].bundle.js',
            chunkFilename: isProd ? '[name].[hash].js' : '[name].bundle.js'
        };
        if (isTest) {
            config.devtool = 'inline-source-map';
        } else if (isProd) {
            config.devtool = 'source-map';
        } else {
            config.devtool = 'eval-source-map';
        }
        config.module = {
            preLoaders: [],
            loaders: [{
                test: /\.js$/,
                loader: 'babel',
                exclude: /node_modules/
            }, {
                test: /\.css/,
                loader: isTest ? 'null' : ExtractTextPlugin.extract('style', 'css?sourceMap!postcss')
            }, {
                test: /\.(png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot)$/,
                loader: 'file'
            }, {
                test: /\.json$/,
                loader: 'json'
            }, {
                test: /\.scss/,
                loader: 'style!css!sass'
            }, {
                test: /\.html$/,
                loader: 'raw'
            }]
        };
        if (isTest) {
            config.module.preLoaders.push({
                test: /\.js$/,
                exclude: [
                    /node_modules/,
                    /\.spec\.js$/
                ],
                loader: 'isparta-instrumenter'
            })
        }
        config.postcss = [
            autoprefixer({
                browsers: ['last 2 version']
            })
        ];
        config.plugins = [];
        if (!isTest) {
            config.plugins.push(
                new HtmlWebpackPlugin({
                    template: './src/public/index.html',
                    inject: 'body'
                }),
                new ExtractTextPlugin('[name].[hash].css', {disable: !isProd})
            )
        }
        if (isProd) {
            config.plugins.push(
                new webpack.NoErrorsPlugin(),
                new webpack.optimize.DedupePlugin(),
                new webpack.optimize.UglifyJsPlugin(),
                new CopyWebpackPlugin([{
                    from: __dirname + '/src/public'
                }]),
                new webpack.ProvidePlugin({
                    $: "jquery",
                    jQuery: "jquery",
                    "window.jQuery": "jquery"
                }))
        }
        config.devServer = {
            contentBase: './src/public',
            stats: 'minimal'
        };
        return config;
    }();
    
    • 5.webpack.config.js配置文件
    var path = require('path');
    module.exports = { 
        entry: path.resolve(__dirname, './wap/main.js'), 
        output: { 
            path: path.resolve(__dirname, './build'), 
            filename: 'bundle.js'
        },
        module: {    
            loaders: [{        
                test: /\.jsx?$/,        
                loader: 'babel'    
            }, {        
                test: /\.css$/,        
                loader: 'style!css'    
            }, {        
                test: /\.less$/,        
                loader: 'style!css!less'    
            }, {        
                test: /\.scss$/,        
                loader: 'style!css!sass'    
            },{        
                test: /\.(png|jpg)$/,        
                loader: 'url?limit=25000'    
            }]
        }
    };
    

    相关文章

      网友评论

          本文标题:Webpack+React+多语言(三) 插件配置

          本文链接:https://www.haomeiwen.com/subject/hgwyvttx.html