React项目的webpack配置

因为react接触webpack,一直用react脚手架里面现成的配置文件,使用webpack进行开发,最近研究一下webpack的API,做下学习笔记

概念

本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。

实现功能:

  • 压缩CSS和JS文件
  • 压缩IMG等图片资源
  • 项目中直接使用LESS
  • 直接使用ES6

Webpack支持Node.js模块格式的配置文件,默认使用当前目录下的webpack.config.js,配置文件为module.exports;其相关配置如下:

  • entry 为项目入口文件
  • output为构建文件的输出配置,其中publicPath表示构建结果最终被真正访问时的路径。线上项目为线上路径。
  • loader 值为一个数组,每一项指定一个规则,其test字段则是规则的正则表达式,若被依赖模块的ID符合该正则表达式,则对依赖模块依次使用规则中loaders字段所指定的loader进行转换
  • plugin 值为一个数组,每一项为一个plugin实例

1. entry

  • 写单页面应用的时候 就一个入口 index.js
entry: {
   app: './src/app.js',
   vendors: './src/vendors.js'
 }

字符串形式;
数组形式,把数组中多个文件打包成一个文件 ;
对象形式,配置多页应用时需要采用,或者抽离指定模块做公共模块

  • 多页面应用程序
入口文件有几个就会生成几个独立的依赖图谱。
entry: {
   pageOne: './src/pageOne/index.js',
   pageTwo: './src/pageTwo/index.js',
   pageThree: './src/pageThree/index.js'
 }

2. output

将所有的模块和资源打包完成后,总需要一个地方来放置它,output 就是做这个事情的,它指定了打包后的文件放置的位置,以及命名等信息。
其最基本配置包括filename和path两项。这两项用以决定上述主js文件的存储行为。

{
 entry: {
   app: './src/app.js',
   search: './src/search.js'
 },
 output: {
   filename: '[name].js',
   path: __dirname + '/dist'
 }
}
如果配置创建了多个单独的 "chunk"(例如,使用多个入口起点或使用像 CommonsChunkPlugin 这样的插件),则应该使用占位符([name])来确保
每个文件具有唯一的名称,此时输出的文件名是app和search。

3. module

首先webpack是一个JS模块打包器,基于NodeJS环境,本身只理解JS文件。在webpack的世界里,一切文件都是模块。如果要处理非JS文件,就需配置module。

概念:在模块化编程中,开发者将程序分解成离散功能块(discrete chunks of functionality),并称之为模块。每个模块具有比完整程序更小的接触面,使得校验、调试、测试轻而易举。 精心编写的模块提供了可靠的抽象和封装界限,使得应用程序中每个模块都具有条理清楚的设计和明确的目的。

webpack 将一切资源看做是一个个模块,然后将其加入依赖树中。任何类型的模块或者说资源文件,理论上都可以通过被转化为JavaScript代码实现与其他模块的合并与加载

webpack中的模块:ES2015 import;commonjs require();AMD define 与 require;css/scss/less 中的 @import;存在于样式表中的 url() 或 html 中的 <img src=...> 的图片

4. loader

loader 用于对模块的源代码进行转换。loader 可以将文件从不同的语言(如 TypeScript)转换为 JavaScript,或将内联图像转换为 data URL。loader 甚至允许你直接在 JavaScript 模块中 import CSS文件

module: {
//识别文件类型,使用对应loader处理文件
    rules: [
      {
        test: /\.css$/,
        use: [
          { loader: 'style-loader' },
          {
            loader: 'css-loader',
            options: {
              modules: true//使用options等命令对loader进行进一步的配置。
            }
          }
        ]
      }
    ]
  }

关于loader能够做的事情:
转换编译:script-loader/babel-loader/ts-loader/coffee-loader等。
处理样式:style-loader/css-loader/less-loader/sass-loader/postcss-loader等。
处理文件:raw-loader/url-loader/file-loader/等。
处理数据:csv-loader/xml-loader等。
处理模板语言:html-loader/pug-loader/jade-loader/markdown-loader等。
清理和测试:mocha-loader/eslint-loader。

5. plugins

插件是webpack的支柱功能,许多功能都靠插件来实现:
抽离公共代码;
统一修改所有代码中的某些值;
对代码进行压缩;
去除所有的console
并且webpack内置了很多插件和第三方插件;

Babel 是一个 JavaScript 编译器

首先要下载babel相关插件,核心插件如下:

  • 安装babel-loader
npm install babel-loader --save-dev
  • 安装转码规则
npm install babel-preset-es2015 --save-dev
  • 创建一个.babelrc文件
{
  "presets": [
    "es2015"//这里是转码规则 想要什么样的转码规则可以自行下载插件 然后将规则加到这里
  ],
  "plugins": []
}
  • 在webpack配置文件中添加babel-loader配置
module.exports = {
  module: {
    rules: [
          {
                test: /\.js$/,
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['env']
                    }
                }
          },
     ]
  }
};

https://www.cnblogs.com/old-street-hehe/p/7116215.html

webpack样式编译器

css-loader与style-loader和autoprefixer(postcss-loader)

js文件中import了css文件,并且想要把css文件作为<style>的内容插入到模版文件,这时候我们要用到webpack的css-loader和style-loader,前者用于在js中加载css,后者把加载的css作为style标签内容插入到html中。另外,如果某些css要考虑到浏览器的兼容性(比如css3中的flex),我们要webpack在打包的过程中自动为这些css属性加上浏览器前缀,这时就用到了postcss-loader和它对应的插件autoprefixer。
css-loader使你能够使用类似@import 和 url(...)的方法实现 require()的功能,style-loader将所有的计算后的样式加入页面中,二者组合在一起使你能够把样式表嵌入webpack打包后的JS文件中。

  • 在webpack配置文件中添加css的loader配置

配置一:css会和js打包到同一个文件中,并不会打包为一个单独的css文件

module.exports = {

   ...
    module: {
        rules: [
             {
                test: /\.css$/,
                use: [
                    {
                        loader: "style-loader"
                    }, {
                        loader: "css-loader"
                    }
                ]
            }
        ]
    }
}

配置二:将CSS文件打包为单独文件

const ExtractTextPlugin = require("extract-text-webpack-plugin");
//extract-text-webpack-plugin该插件的主要是为了抽离css样式,防止将样式打包在js中引起页面样式加载错乱的现象
module.exports = {
   ...
    module: {
       rules: [
            {
                test:/\.css$/,
                exclude: /node_modules/,
                // 抽取 css 文件到单独的文件夹
                //use:指需要什么样的loader去编译文件,这里由于源文件是.css所以选择css-loader
                use: ExtractTextPlugin.extract({
                    fallback: "style-loader",
                    //fallback:编译后用什么loader来提取css文件
                    publicPath: config.cssPublicPath,
                    // 设置 css 的 publicPath
                    use: [{
                        loader:"css-loader",
                        options:{
                            // 开启 css 压缩
                            minimize:true,
                        }
                    },
                        {
                            loader:"postcss-loader",
                        }
                    ]
                })
            }
        ]
    }
}

一点node的知识:

全局变量

__dirname:node中的全局变量,存储的是文件所在的文件目录
__filename:node中的全局变量,存储的是文件名

占位符

[id]:webpack给块分配的内部chunk id,如果你没有隐藏,你能在打包后的命令行中看到;
[hash]:每次构建过程中,生成的唯一 hash 值;
[chunkhash]: 依据于打包生成文件内容的 hash 值,内容不变,值不变;
[ext]: 资源扩展名,如js,jsx,png等等;
[name]:代表打包后文件的名称,在entry或代码中(之后会看到)确定;
requiare.resolve,读取文件绝对路径
参考文章
http://blog.csdn.net/meinanqihao/article/details/78217918
https://www.cnblogs.com/senjougahara/p/5350196.html

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

推荐阅读更多精彩内容