当前位置: 首页 > 知识库问答 >
问题:

vue.js - vue自定义loader运行报错?

臧梓
2024-01-20

写了个loader想对vue单文件的template预先做些处理,不过运行起来会有报错

vue.config.js

const { defineConfig } = require('@vue/cli-service')const path = require('path')// const { VueLoaderPlugin } = require('vue-loader')module.exports = defineConfig({  transpileDependencies: true,  chainWebpack: config => {       config.module      .rule('vue')      // .test(/\.vue$/)      .use('vue-loader')      .loader('vue-loader')      .end()      .use('my-loader')      .loader(path.resolve(__dirname, './my-loader.js'))      // .before('vue-loader')      .end()  }})

my-loader.js

module.exports = function (content) {  const templateMatch = content.match(/<template>([\s\S]*?)<\/template>/);  let restContent = content  if (templateMatch) {    const templateContent = templateMatch[1];    restContent = content.replace(/<template>[\s\S]*?<\/template>/, '');        let returnContent = templateContent.replace(/<\/el-/g, '\n</el-')    returnContent = returnContent.replace(/<el-/g, '\n<el-')    returnContent = returnContent.replace(/<input/g, '\n<input')    var regInput = /<(input)([^<>]*)>/g // tmp    let contentArr = returnContent.split('\n')    let resultArr = contentArr.map((item, index) => {      if (regInput.test(item)) {        item = item.replace(/<input/g, '<input name="input_name"')      }      return item    })    const result = resultArr.join('\n')    console.log('result', result)    // return result    return `module.exports = ${JSON.stringify(result + restContent)};`    // this.callback(null, result)    // return  } else {    // return content;    return `module.exports = ${JSON.stringify(content)};`    // this.callback(null, content)    // return  }}

自定义的loader只是在vue-loader前处理一下template,之后的处理应该会交给vue-loader继续执行。不过实际运行起来,vue单文件的js跟css都会有错误。

ERROR in ./src/App.vue?vue&type=style&index=0&id=7ba5bd90&lang=css

百思不得其解,不知道各位能不能不能帮忙指点迷津。项目代码已上传到github

看过相关文章,暂时不清楚具体原因

共有1个答案

况喜
2024-01-20

代码微调了下,不报错了
1、自定义的loader要在vue-loader之前
2、loader的链式处理依赖了一个执行顺序,要确保经过所有的loader之后生成一个带module.exports 的js字符串代码文件;自定义的loader只是中间过程,直接返回内容交给vue-loader处理,不需要module.exports

const { defineConfig } = require('@vue/cli-service')const path = require('path')// const { VueLoaderPlugin } = require('vue-loader')module.exports = defineConfig({  transpileDependencies: true,  chainWebpack: config => {       config.module      .rule('vue')      // .test(/\.vue$/)      .use('vue-loader')      .loader('vue-loader')      .end()      .use('my-loader')      .loader(path.resolve(__dirname, './my-loader.js'))      .before('vue-loader')      .end()  }})
const fs = require('fs');const path = require('path');module.exports = function (content) {  var output = ''  var moudle = this.resource.split('\\src\\')[1]  console.log(moudle)  var dir = moudle.replace(/[?&=]/g, '_')  var type = 'js'  if (moudle.includes('type=style')) {    type = 'css'  }  if (moudle.includes('type=template')) {    type = 'html'  }  if (type == 'html') {    let returnContent = content.replace(/<\/el-/g, '\n</el-')    returnContent = returnContent.replace(/<el-/g, '\n<el-')    returnContent = returnContent.replace(/<input/g, '\n<input')    var regInput = /<(input)([^<>]*)>/g // tmp    let contentArr = returnContent.split('\n')    let resultArr = contentArr.map((item, index) => {      if (regInput.test(item)) {        item = item.replace(/<input/g, '<input name="input_name"')      }      return item    })    const result = resultArr.join('\n')    output = result        createDirAndWriteFile(`.output/${dir}已处理`, `old.${type}`, content);    createDirAndWriteFile(`.output/${dir}已处理`, `new.${type}`, output);  } else {    output = content;    createDirAndWriteFile(`.output/${dir}未处理`, `old.${type}`, content);    createDirAndWriteFile(`.output/${dir}未处理`, `new.${type}`, output);    // for (const key in this) {    //   if (Object.hasOwnProperty.call(this, key)) {    //     const element = this[key];    //     try {    //       if (typeof element == 'object') {    //         createDirAndWriteFile(`.output/${dir}未处理`, `${key}.json`, JSON.stringify(element, null, 2));    //       } else {    //         createDirAndWriteFile(`.output/${dir}未处理`, `${key}.txt`, element);    //       }              //     } catch (error) {    //     }    //   }    // }  }  return output}function createDirAndWriteFile(dirPath, fileName, content) {  // 创建目录    if (!fs.existsSync(dirPath)) {    fs.mkdirSync(dirPath, { recursive: true });  }  // 拼接文件路径    const filePath = path.join(dirPath, fileName);  // 写入文件    fs.writeFileSync(filePath, content);}
 类似资料:
  • 写的自定义loader,匹配configCss文件夹下的index.css文件,vue.config.js配置如图,我感觉我配置的是正确的,但是终端控制台不显示我写的自定义loader的console,这是为什么啊~~~ 希望写的自定义loader能读取index.css文件

  • Parsing error: The keyword 'interface' is reserved 只有在 .vue 文件中定义 interface 才报错 eslint.config.js:

  • 主要内容:实例,实例,钩子,实例,实例除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例 <div id="app"> <p>页面载入时,input 元素自动获取焦点:</p> <input v-focus> </div> <script> // 注册一个全局自定义指令 v-focus Vue.d

  • # 5.1 自定义报告是什么? {#51-自定义报告是什么?} 在进行网站分析的时候,通常需要关联多个维度进行分析, 同时根据不同组合维度,选取合适的衡量指标。 例如,衡量 广告流量 达成的事件数 或 不同来源流量的所使用客户端及其地域分布。 在默认报告中,系统提供了单个维度的分析视角。 而自定义报告则可实现关联不同分析维度,衡量站点数据表现。 示例如下: 维度1 维度2 维度3 衡量指标 广告维

  • vue运行没有问题,通过链接打开 控制台打开报错 页面空白 找到了 编辑器自动给我引入了一个文件 无语!!!!!!!!!!!!!!!

  • 简介 除了默认设置的核心指令( v-model 和 v-show ),Vue 也允许注册自定义指令。注意,在 Vue2.0 里面,代码复用的主要形式和抽象是组件——然而,有的情况下,你仍然需要对纯 DOM 元素进行底层操作,这时候就会用到自定义指令。下面这个例子将聚焦一个 input 元素,像这样: Vue.directive('focus', { inserted: function (el)