前面三节,我主要给你们分享了有关webpack的一些配置的知识点,如何打包js文件,而若是咱们遇到其余类型的资源如图片、css、字体font等等,咱们该如何处理呢?今天会介绍预处理器(loader),它赋予了Webpack可处理不一样资源类型的能力,极大丰富了其可扩展性。javascript
若是想了解Webpack的基础配置能够参考如下地址:css
在一个项目中,咱们要面临着各类各样的资源,如何让Webpack很好的处理这些资源呢?这个时候咱们须要借助于预处理器(loader),loader的字面意思是装载器,在Webpack中它的实际功能则更像是预处理器。Webpack自己只认识JavaScript,对于其余类型的资源必须预先定义一个或多个loader对其进行转译,输出为Webpack可以接收的形式再继续进行,所以loader作的其实是一个预处理的工做。html
// common.css body { font-size: 20px; background: #0fc; }
//index.js import './common.css'
执行的结果如上图,因而可知,Webpack是没法处理css文件,咱们须要给安装预处理css-loader。安装步骤以下前端
npm install --save-dev css-loader
而后咱们将loader 引入项目中,配置webpack.config.js配置以下:java
const path = require('path') module.exports = { context: path.join(__dirname, './src'), entry: { index: './index.js' }, output: { path: path.join(__dirname, 'dist'), filename: 'index.js' }, mode: 'development', module: { rules: [ { test: /\.css$/i, use: [ 'css-loader'], }, ], } }
与loader相关的配置都在module对象中,其中module.rules表明了模块的处理规则。每条规则内部能够包含不少配置项,这里咱们只使用了最重要的两项—test和use。node
不少时候,在处理某一类资源时咱们都须要使用多个loader。如,对于SCSS类型的资源来讲,咱们须要sass-loader来处理其语法,并将其编译为CSS;接着再用css-loader处理CSS的各种加载语法;最后使用style-loader来将样式字符串包装成style标签插入页面。
下面引入style-loader,安装命令以下:webpack
npm install --save-dev style-loader
配置代码以下:web
const path = require('path') module.exports = { context: path.join(__dirname, './src'), entry: { index: './index.js' }, output: { path: path.join(__dirname, 'dist'), filename: 'index.js' }, mode: 'development', module: { rules: [ { test: /\.css$/i, use: ['style-loader', 'css-loader'], }, ], } }
此时再进行打包,样式就会生效了,应该会看到页面中插入了一个style标签,包含了CSS文件的样式,这样咱们就完成了从JS文件加载CSS文件的配置。
打包效果以下图:
运行效果以下图
把style-loader放在css-loader前面,这是由于在Webpack打包时是按照数组从右边往左边的顺序将资源交给loader处理的,所以要把最后生效的放在左边。正则表达式
loader做为预处理器一般会给开发者提供一些配置项,在引入loader的时候能够经过options将它们传入typescript
module: { rules: [ { test: /\.css$/i, use: ['style-loader', { loader: 'css-loader', options: { // 有关css-loader的配置 } } ], }, ], }
module: { rules: [ { test: /\.css$/i, use: ['style-loader', 'css-loader'], exclude: /node_modules/ }, ], }
exclude规则内的使node_modules中的模块不会执行这条规则。该配置项一般是必加的,不然可能拖慢总体的打包速度。
module: { rules: [ { test: /\.css$/i, use: ['style-loader', 'css-loader'], include: /src/ }, ], }
include表明该规则只对正则匹配到的模块生效。假如咱们将include设置为工程的源码目录,天然而然就将node_modules等目录排除掉了。
若是exclude 和include同时存在,则exclude权限比较高
resource与issuer可用于更加精确地肯定模块规则的做用范围,在Webpack中,咱们认为被加载模块是resource,而加载者是issuer
module: { rules: [ { use: ['style-loader', 'css-loader'], resource: { test: /\.css$/i, exclude: /node_modules/ }, issuer: { test: /\.js$/i, exclude: /node_modules/ } }, ], }
经过添加resource对象来将外层的配置包起来,区分了resource和issuer中的规则,这样就一目了然了。
enforce用来指定一个loader的种类,只接收“pre”或“post”两种字符串类型的值。事实上,咱们也能够不使用enforce而只要保证loader顺序是正确的便可。配置enforce主要的目的是使模块规则更加清晰,可读性更强,尤为是在实际工程中,配置文件可能达到上百行的状况,难以保证各个loader都按照预想的方式工做,使用enforce能够强制指定loader的做用顺序。
npm install babel-loader babel-core babel-preset-env
{ test: /\.js$/, exclude: /(node_modules|bower_components)/, use: { loader: 'babel-loader', options: { cacheDirectory: true, presets: [ [ 'env', { modules: false } ] ] } } }
因为babel文件很大没,因此要排除node_modules|bower_components
对于babel-loader自己咱们添加了cacheDirectory配置项,它会启用缓存机制,在重复打包未改变过的模块时防止二次编译,一样也会加快打包的速度
babel-loader支持从.babelrc文件读取Babel配置,所以能够将presets和plugins从Webpack配置文件中提取出来,也能达到相同的效果。
npm install ts-loader typescript
webapck.config.js配置以下
rules: [ { test: /\.ts$/, use:'ts-loader' } ]
有关Webpack预处理器(loader)就暂时分析到这里,这仅表明我的观点,欢迎拍砖,如想了解更多请扫描下面: