webpack如何写一个markdown-loader?

376 阅读2分钟

相关文章

[必看!!!]此篇由浅入深介绍webpack如何自定义一个loader
b站视频讲解(磨刀不误砍柴工--前置知识)
b站视频讲解(实现babel-loader)
b站视频讲解(实现markdown-loader)

实现一个markdown的Loader

markdown展示

image.png

我们webpack是无法打包.md文件的。在这个过程中会进行报错,如:

image.png

因为我们在index.js文件里引入了index.md文件:

import './index.md' // 这里引入一个markdown的文件
console.log('src/index.js')
const name = 'colin'

const x = () => {
  console.log('---x')
}
x()

index.md文件:

# webpack study

## loader
+ 这里是md-loader

```js
const x = {
	name: 'ckj' 
}
#### 创建md-loader,并初步配置
> md-loader.js

```javascript
module.exports = function(ctx) {
  return ctx
}

webpack.config.js

{
  test: /\.md$/,
  use: 'md-loader'
}

了解marked并使用

先下载marked

npm i marked -D

在md-loader.js文件里使用

const {marked} = require('marked')// 引用
module.exports = function(ctx) {

  // 转换
  const content = marked(ctx)
  console.log(content)
  return content
}

image.png 发现已经处理好我们的md文件特殊语法了! 但打包还是没有成功......

返回的结果必须是模块化的内容

所以,我们需要将我们生成的html内容插进JavaScript里,并导出

const {marked} = require('marked')
module.exports = function(ctx) {

  // 转换
  const content = marked(ctx)

  // 返回的结果必须是模块化的内容
  const innerContent = "`" + content + "`"
  const moduleContent = `var code = ${innerContent}; export default code;`
  return moduleContent
}

index.js文件引入index.md

import code from './index.md'
console.log(code)

console.log('src/index.js')
const name = 'colin'

const x = () => {
  console.log('---x')
}
x()

image.png 所以整个流程就是: 先配对md文件 -> 告诉他使用md-loader -> md-loader去转换代码为html -> html转换为模版导入 -> 最终打包

这个时候我们可以去看打包好的代码里面我们转换后的代码 当然我们需要在webpack.config.js文件里将devtools设置为false(为了看的清晰)

module.exports = {
  mode: 'development',
  devtool: false,
  entry: "./src/index.js",
}

bundle.js源码里的代码:

image.png

使用HtmlWebpackPLugin来查看结果

先安装

npm i html-webpack-plugin -D

webpack.config.js 导入使用

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin') // 引用

module.exports = {
  mode: 'development',
  devtool: false,
  entry: "./src/index.js",
  output: {
    path: path.resolve(__dirname, './build'),
    filename: 'bundle.js'
  },
  resolveLoader: {
    modules: ['node_modules', './loader']
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        use: {
          loader: 'babel-loader',
        }
      },
      {
        test: /\.md$/,
        use: 'md-loader'
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin() // 注册使用
  ]
}

index.js插入code

import code from './index.md'

console.log('src/index.js')
const name = 'colin'

const x = () => {
  console.log('---x')
}
x()
document.querySelector('body').insertAdjacentHTML('beforeend', code) // 插入到body上

// 或者 document.body.innerHTML = code

这个时候打包,会自动生成一个html文件,我们启动html文件预览,控制台也能打印出我们经过转换后的md文件源代码image.png

改变样式

安装css-loader和style-loader

npm i css-loader style-loader -D

webpack.config.js配置loader

 module: {
    rules: [
      {
        test: /\.js$/,
        use: {
          loader: 'babel-loader',
        }
      },
      {
        test: /\.md$/,
        use: 'md-loader'
      },
      {
        test: /\.css$/,
        use: ['style-loader','css-loader'] // 先引入style-loader
      }
    ]
  },

index.css编写代码块样式,并引入index.js

pre{
  background: #eff0f0;
  padding: 1rem;
  border-radius: 8px;
}

打包-> image.png

第三方库-高亮代码块!

这里下载需要助理版本!!

npm i marked@7.0.5 -D // 退版本
npm i highlight.js // 高亮js包

md-loader.js引入highlight并配置

const {marked} = require('marked')
const hljs = require('highlight.js')
module.exports = function(ctx) {
  // marked解析前 设置高亮标识
  
  marked.setOptions({
    highlight: function(code, lang){  // lang是语言,code是代码块
      return hljs.highlight(lang, code).value
    }
  })

  // 转换
  const content = marked(ctx)

  // 返回的结果必须是模块化的内容
  const innerContent = "`" + content + "`"
  const moduleContent = `var code = ${innerContent}; export default code;`
  return moduleContent
}

打包看调试工具-> 可以看到分成了几个模块,那我们就可以拿到选择器做css了?不做过多解释咯~

image.png

或者!在index.css文件里引入highlight库带给我们的默认样式。其实库内还有需要样式

import 'highlight.js/styles/default.css'

比如这个好看的样式就是我们github的样式

import 'highlight.js/styles/github.css' // 即可

image.png