手写 webpack
初始化项目
1 | yarn init -y |
配置
package.json
1 | "bin": "./bin/pack.js", |
新建文件夹 bin,新建文件 pack.js
1 | #!/usr/bin/env node |
新建文件夹 lib,文件 Compiler.js ,编写编译文件
1 | const path = require('path'); |
npm link
在本地编写的 npm 模块中执行 npm link,将模块链接到全局
mac 中使用 sudo npm link在需要项目中使用的执行 npm link,将模块连接到项目中
- 想去掉 link :npm unlink my-utils
webpack 配置
1 | let path = require('path'); |
手写 less-loader
1 | let less =require('less'); |
手写 style-loader
1 | function loader(source){ |
loader 加载顺序
- 从左到右加载
1 | rules: [ |
- 从下到上加载
1 | rules:[ |
- enfore 设置执行顺序,pre-前置 post-后置 normal-正常
loader1 loader2 loader3
1 | rules:[ |
- inline 内置 loader
加载顺序 pre-normal-inline-post
新建 a.js,在 index.js 中添加
1 | let str =require('inline-loader!./a.js') |
执行顺序
! 没有 normal
1 | let str =require('!inline-loader!./a.js') |
执行顺序
-! 不执行 inline-loader 前面的 loader pre-normal
1 | let str =require('-!inline-loader!./a.js') |
执行顺序
!!其他 loader 都不执行
1 | let str =require('!!inline-loader!./a.js') |
执行顺序
手写 babel-loader
- 安装模块@babel/core loader-utils
1 | const babel = require('@babel/core');//核心模块 |
手写 banner-loader 在打包的 js 前面加上相同前缀
1 | const loaderUtils = require('loader-utils'); |
手写 file-loader
1 | const loaderUtils = require('loader-utils'); |
手写 url-loader
1 | const loaderUtils = require('loader-utils'); |
css-loader 解析 background: url(‘./img.jpg’)将路径变成 require(‘./img.jpg’)
1 | function loader(source){ |
loader.pitch
1 | // 在style-loader上 写了pitch |
手写文件列表 FileListPlugin
1 | class FileListPlugin{ |
使用
1 | new FileListPlugin({ |
将 css 和 js 内联到 html 中
1 |
|