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

  • 多语言的实现了,现在安装我们一般所需要的插件

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'    
        }]
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 webpack介绍和使用 一、webpack介绍 1、由来 ...
    it筱竹阅读 10,933评论 0 21
  • 无意中看到zhangwnag大佬分享的webpack教程感觉受益匪浅,特此分享以备自己日后查看,也希望更多的人看到...
    小小字符阅读 8,080评论 7 35
  • GitChat技术杂谈 前言 本文较长,为了节省你的阅读时间,在文前列写作思路如下: 什么是 webpack,它要...
    萧玄辞阅读 12,609评论 7 110
  • 没骨画"是中国画的一种技法名称,即不用墨线勾勒,直接用色彩描绘物象。没骨画至今已经有一千多年的历史,在长期的发展过...
    彦子八毛话图阅读 318评论 1 3
  • 青春就此随风去, 不再回来,不再回来,往事悲凉已看开。 昔年爱到平房上, 孤影徘徊,孤影徘徊,远处青山连一排。
    林月寒阅读 440评论 2 8