美文网首页
深入webpack之loader原理

深入webpack之loader原理

作者: 左冬的博客 | 来源:发表于2021-08-09 13:42 被阅读0次

上篇文章手写简易打包器的功能是不完善的,比如,只支持JS文件,连CSS都不支持 :)

如何加载CSS?

思路

  • 我们的打包器只支持JS
  • 我们想要加载CSS
  • 如果把CSS变成JS那么就可以加载CSS啦

怎么把CSS变成JS?

在获取依赖文件内容的时候对于不同文件类型做一些小的处理

// 获取文件内容,将内容放至 depRelation
  let code = readFileSync(filepath).toString()
  if(/\.css$/.test(filepath)){ // 如果文件路径以 .css 结尾
    // 把css改造成js 
    code = `
      const str = ${JSON.stringify(code)}
      if(document){
        // 生成style标签
        const style = document.createElement('style')
        style.innerHTML = str
        // 将style标签插入head
        document.head.appendChild(style)
      }
      export default str
    ` 
  }
  const { code: es5Code } = babel.transform(code, {
    presets: ['@babel/preset-env']
  })

最后再将bundle.js引入index.html,样式即可生效

把刚才代码优化成css-loader

新建css-loader.js

// css-loader.js
const transform = code =>  `
      con st str = ${JSON.stringify(code)}
      if(document){
          // 生成style标签
          const style = document.createElement('style')
          style.innerHTML = str
          // 将style标签插入head
          document.head.appendChild(style)
      }
      export default str
`

export default transform

这个函数实际就是将css代码 变成js代码

然后在打包文件里面引入它

// bundle.js
  if(/\.css$/.test(filepath)){ // 如果文件路径以 .css 结尾
    code = require('./css-loader.js')(code)
  }

运行发现报错了,原来是node不识别export default transform的写法,需要改成这

// 避免export关键字
module.exports = transform

搞定,这下可以使用自己的css-loader加载css文件了

总结:所以loader到底是什么

  • 一个loader可以是一个普通的函数
  • loader也可以是一个异步函数
    async function transform(code) {
      const code2 = await doSomting(code)
      return code2
    }
    module.exports = transform // 旧版本Node.js不支持export关键字
    

另外,为什么使用require而不是import,主要是为了方便动态加载,且旧版本Node.js只能支持require

webpack到底有多少个loader

相关文章

  • 深入webpack之loader原理

    上篇文章手写简易打包器[https://www.jianshu.com/p/91b47a9d0e40]的功能是不完...

  • bunny笔记|手写webpack

    学习目标 了解webpack打包原理 了解webpack的loader原理 了解webpack的插件原理 了解as...

  • 2019-06-02

    webpack打包的原理:webpack都有entry、module、loader、chunk、output等配置...

  • Webpack Loader源码导读之css-loader

    原文地址:Webpack Loader源码导读之css-loader 在上一篇Webpack Loader源码导读...

  • webpack 之 css module

    webpack 之 css module webpack配置css-loader?modulesmodules ...

  • webpack的加载顺序

    搬运全栈弄潮儿的文章webpack之loader执行顺序及原理[https://www.jianshu.com/p...

  • 7 webpack + vue-loader

    vue-loader vue-loader基于webpack webpack+vue-loader

  • webpack

    loader 是webpack的核心工作原理,通过这些资源加载器,完成webpack的打包工作plugin相当于挂...

  • webpack4打包css,html

    webpack安装 webpack打包css 安装style-loader css-loader webpack打...

  • 2021.4.15 前端面试复习

    首屏加载慢的原理 webpack的loader编译原理 render函数原理 实现高阶组件对饿了么ui组件进行二次...

网友评论

      本文标题:深入webpack之loader原理

      本文链接:https://www.haomeiwen.com/subject/wjqivltx.html