原创不易,未经作者允许禁止转载!!
Loader可以用于对模块的源代码进行转换; 在加载这个模块时,webpack其实并不知道如何对其进行加载,我们必须定制对应的loader来完成这个功能。
import "css-loader!../css/index.css"
; loader和文件路径用!分隔npm i style-loader --save
npm install css-loader --save
const path = require("path");
module.exports = {
entry: "./src/js/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "build"),
},
module: {
rules: [
{
test: /\.css$/, //资源文件匹配正则表达式
use: [
{
loader: "style-loader",
options: {},
},
// 简写:
// “css-loader”
{
// 完整写法
loader: "css-loader", // 对应的loader
options: {},
},
],
},
],
},
};
npm install less-loader less --save
安装这两个插件后使用postcss-cli操作,需要用到autoprefixer插件
npm install postcss postcss-cli --save
npm install autoprefixer --save
npx postcss --use autoprefixer -o '输出路径' '输出路径'
,例如:npx postcss --use autoprefixer -o ./src/css/result.css ./src/css/user.css
npm install postcss-loader autoprefixer --save
{
test: /\.css$/, //资源文件匹配正则表达式
use: [
{
loader: "style-loader",
options: {},
},
// 简写:
// “css-loader”
{
// 完整写法
loader: "css-loader", // 对应的loader
options: {},
},
{
loader: "postcss-loader",
options: {
postcssOptions: {
plugins: [require("autoprefixer")],
},
},
},
],
},
npm install postcss-preset-env --save
webpack.config.js
const path = require("path");
module.exports = {
entry: "./src/js/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "build"),
},
module: {
rules: [
{
test: /\.css$/, //资源文件匹配正则表达式
use: [
{
loader: "style-loader",
options: {},
},
// 简写:
// “css-loader”
{
// 完整写法
loader: "css-loader", // 对应的loader
options: {},
},
"postcss-loader",
],
},
{
test: /\.less$/,
use: ["style-loader", "css-loader", "postcss-loader", "less-loader"],
},
],
},
};
postcss.config.js
module.exports = {
plugins: [
// 引入
// require("postcss-preset-env")
//简写
"postcss-preset-env"
],
};
Before
:fullscreen{
}
.content{
user-select: none;
transition: all 2s ease;
}
After
:-webkit-full-screen{
}
:-ms-fullscreen{
}
:fullscreen{
}
.content{
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
transition: all 2s ease;
}
/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVzZXIuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBOztBQUZBOztBQUVBOztBQUZBOztBQUVBOztBQUVBO0lBQ0kseUJBQWlCO09BQWpCLHNCQUFpQjtRQUFqQixxQkFBaUI7WUFBakIsaUJBQWlCO0lBQ2pCLHVCQUF1QjtBQUMzQiIsImZpbGUiOiJyZXN1bHQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiOmZ1bGxzY3JlZW57XG5cbn1cblxuLmNvbnRlbnR7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgdHJhbnNpdGlvbjogYWxsIDJzIGVhc2U7XG59Il19 */
const path = require("path");
module.exports = {
entry: "./src/js/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "build"),
},
module: {
rules: [
{
test: /\.css$/, //资源文件匹配正则表达式
use: [
{
loader: "style-loader",
options: {},
},
// 简写:
// “css-loader”
{
// 完整写法
loader: "css-loader", // 对应的loader
options: {
importLoaders: 1,
},
},
"postcss-loader",
],
},
{
test: /\.less$/,
use: [
"style-loader",
{
// 完整写法
loader: "css-loader", // 对应的loader
options: {
importLoaders: 2,
},
},
"postcss-loader",
"less-loader",
],
},
],
},
};
希望解析、读取文件,例如图片
npm install --save file-loader
rule:
{
test: /\.(png|jpe?g|gif|svg)$/,
use: [
{
loader:"file-loader",
options:{
name:"[name].[hash:6].[ext]",
outputPath:"img"
// limit(url-loader)
}
}
],
},
// 打包图片
{
test: /\.(png|jpe?g|gif|svg)$/,
type: "asset/resource",
generator: {
filename: "img/[name].[hash:6][ext]",
},
},
// BASE64编码并限制大小
{
test: /\.(png|jpe?g|gif|svg)$/,
type: "asset/inline",
parser: {
dataUrlCondition: {
maxSize: 100 * 1024,
},
},
},
// 混合使用,限制大小,判断打包方式
{
test: /\.(png|jpe?g|gif|svg)$/,
type: "asset",
generator: {
filename: "img/[name].[hash:6][ext]",
},
parser: {
dataUrlCondition: {
maxSize: 100 * 1024,
},
},
},
// 方式一 ouput对象
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "build"),
assetModuleFilename: "img/[name].[hash:6][ext]",
},
// 方式二 rule对象(推荐)
{
test: /\.(png|jpe?g|gif|svg)$/,
type: "asset/resource",
generator: {
filename: "img/[name].[hash:6][ext]",
},
}
rule对象:
{
test: /\.ttf|eot|woff2?$/i,
type: "asset/resource",
generator: {
filename: "font/[name].[hash:6][ext]",
},
},
Loader是用于对模块的源代码进行转换处理,之前已经使用过很多Loader,例如css-loader、style-loader、babel-loader等
{
context: path.resolve(__dirname, "../"),
entry: "./src/main.js",
output: {
path:path.resolve(__dirname,"../build"),
filename:"bundle.js",
},
module: {
rules:[
{
test:/\.js$/i,
use:[
"./loaders/demoLoader.js"
]
}
]
}
}
module: {
rules:[
{
test:/\.js$/i,
use:[
"demoLoader"
]
}
]
},
resolveLoader:{
modules:["./loaders", "node_modules"]
}
rules:[
{
test:/\.js$/i,
use:[
"demoLoader1",
"demoLoader2",
"demoLoader3",
]
}
]
image.png
事实上还有另一种Loader,称之为PitchLoader
module.exports = function (content){
console.log("loader", content)
this.callback(null,content)
}
module.exports = function (content){
const callback = this.async()
setTimeout(()=>{
console.log("async loader",content)
callback(null, content)
})
}
npm i loader-utils
{
test:/\.js$/i,
use:[
"syncLoader",
"asyncLoader",
{
loader:"optionLoader",
options:{
type:"options",
desc:"demo"
}
}
]
}
const { getOptions } = require("loader-utils")
module.exports = function (content){
const callback = this.async();
const options = getOptions(this)
setTimeout(()=>{
console.log("asyncLoader",content, options)
callback(null, content)
})
}
// asyncLoader console.log("main.js") { type: 'options', desc: 'demo' }
npm i schema-utils
{
"type": "objcet",
"properties": {
"type": {
"type": "string",
"description": "请输入正确的参数类型"
},
"desc": {
"type": "string",
"description": "描述必须为字符串类型"
}
},
"additionalProperties": true
}
const { getOptions } = require("loader-utils")
const { validate } = require("schema-utils")
const loaderSchema = require("../schema/schema.json")
module.exports = function (content){
const callback = this.async();
const options = getOptions(this)
validate(loaderSchema, options)
setTimeout(()=>{
console.log("asyncLoader",content, options)
callback(null, content)
})
}
const babel = require("@babel/core")
const { getOptions } = require("loader-utils")
const { validate } = require("schema-utils")
const babelSchema = require("../schema/babel.json")
module.exports = function (content){
const callback = this.async();
const option = getOptions(this);
validate(babelSchema, option)
babel.transform(content, option, (err, res) =>{
if(err){
callback(err)
}else{
callback(null, res.code)
}
})
}
{
"type": "object",
"properties": {
"presets": {
"type": "array"
}
},
"additinalProperties": true
}
module: {
rules:[
{
test:/\.js$/i,
use:[
"syncLoader",
"asyncLoader",
{
loader:"optionLoader",
options:{
type:"options",
desc:"demo"
}
},
{
loader:"myBabelLoader",
options: {
presets:["@babel/preset-env"]
}
}
]
}
]
},
npm i marked highlight.js
rules:[
{
test:/\.css$/i,
use:[
"style-loader",
"css-loader"
]
},
{
test:/\.md$/i,
use:["mdLoader"]
},
]
const marked = require("marked")
const hljs = require("highlight.js")
module.exports = function (content){
marked.setOptions({
highlight:function (code,lang){
return hljs.highlight(lang, code).value
}
})
const htmlContent = marked(content)
const innerContent = "`" + htmlContent + "`"
const moduleCode = `var code=${innerContent};export default code;`
console.log(moduleCode)
return moduleCode;
}
import md from "./index.md"
import "highlight.js/styles/default.css"
console.log("main.js")
const ele = document.createElement("div")
ele.innerHTML = md;
document.body.appendChild(ele)