loader其实就是解析器,用来解析模块的,前面说到过webpack只认识js和json文件。配置方式如下:
安装用来解析css的loader:npm i css-loader style-loader
在webpack的配置文件中使用配置css的解析规则:
module:{
rules:[
{
test:/\.css$/,
use:["style-loader","css-loader"]
}
]
}
经过上述操作我们就可以使用css了,下面进行css使用的测试:
在src下新建style目录,并在目录下编写index.css文件。
body,
html {
height: 100%;
padding: 0px;
margin: 0px;
}
#app {
color: #1890FF;
text-align: center;
font-weight: 700;
line-height: 100px;
}
在index.js文件中引入index.css。
import './style/index.css'
重新执行npm run serve
可以看到页面的字体的样式。(每次修改webpack的配置都需要重启服务)
安装解析less的loader:npm i less less-loader
编写less解析的规则
{
test:/\.less$/,
use:["style-loader","css-loader","less-loader"]
}
PostCSS是一个通过JavaScript来转换样式的工具;这个工具可以帮助我们进行一些CSS的转换和适配,比如自动添加浏览器前缀、css样式的重置;但是实现这些工具,我们需要借助于PostCSS对应的插件。
在webpack中使用postcss就是使用postcss-loader来处理的;安装:npm install postcss-loader autoprefixer -D
rules:[
{
test:/\.css$/,
use:["style-loader","css-loader",{
loader:"postcss-loader",
options:{
postcssOptions:{
plugins:[
require("autoprefixer")
]
}
}
}]
}
]
比如:**user-select: none;**会被打包为:
#app{
height:100%;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
比autoprefixer更好用,可以把十六进制八位转为rgba。npm install postcss-preset-env -D
rules:[
{
test:/\.css$/,
use:["style-loader","css-loader",{
loader:"postcss-loader",
options:{
postcssOptions:{
plugins:[
require("postcss-preset-env")
]
}
}
}]
}
]
将postcss的配置单独抽出来。
module.exports = {
plugins:[
require('postcss-preset-env')
]
}
在我们使用@import的时候,如果按照上述写法配置webpack则不会让postcss处理@import的CSS,因为是通过js去先找到当前的css由于@import是CSS语法,所以不会让postCSS解析,下面这个配置可以让其加载。
rules:[
{
test:/\.css$/,
use:["style-loader",{
loader:"css-loader",
options:{
importLoaders:1
}
},{
loader:"postcss-loader",
// 可以在postcss.config.js里面配置
// options:{
// postcssOptions:{
// plugins:[
// require("autoprefixer")
// ]
// }
// }
}]
}
]
因为关于style样式处理用相同的一部分,所以封装简写代码
const { resolve } = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const getCssLoaders = (loaders = []) => ( ['style-loader', {
loader: 'css-loader',
options: {
importLoaders: 1
}
}, 'postcss-loader' , ...loaders])
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: resolve(__dirname, './dist')
},
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html'
})
],
mode: 'development',
module: {
rules: [
{
test: /\.less$/,
use: getCssLoaders([ 'less-loader'])
},
{
test: /\.css$/,
use: getCssLoaders()
}
]
}
}
npm i file-loader
{
test: /\.(png|jpe?g|gif|svg)$/,
use: [
{
loader: 'file-loader',
options: {
name: "[name].[hash:6].[ext]",
outputPath:'img'
}
}
]
}
url-loader和file-loader的工作方式是相似的,但是可以将较小的文件,转成base64的URI
{
test: /\.(png|jpe?g|gif|svg)$/,
use: [
{
loader: 'url-loader',
options: {
name: "img/[name].[hash:6].[ext]",
limit: 100 * 1024
}
}
]
}
需要安装全局的TypeScript环境,使用npm i -g typescript ,可以使用tsc -V查看版本。
如果我们希望在webpack中使用TypeScript,那么我们可以使用ts-loader来处理ts文件:npm install ts-loader -D
{
test: /\.ts$/,
exclude: /node_modules/,
use: "ts-loader"
}
也可以使用@babel/tranform-typescript配合babel使用