写了个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、自定义的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)