vue3项目中用codemirror实现格式化java代码及不太成熟的历程

本期只介绍创作的曲折历程,并不能解决实际问题,现有插件不支持,总结在了最后

一、案例效果

vue3项目使用preitter 搭配prettier-plugin-java 实现codemirror 格式化 java

二、步骤

1. 安装prettier和prettier-plugin-java,可以通过npm或yarn进行安装:
npm install --save-dev prettier prettier-plugin-java
yarn add --dev prettier prettier-plugin-java
2. 在你的项目中,你可以创建一个prettier的配置文件.prettierrc.js,并在其中添加如下配置
module.exports = {
  plugins: ["prettier-plugin-java"],
};
3. codemirror组件中使用prettier来格式化你的Java代码
import prettier from "prettier";
import javaPlugin from "prettier-plugin-java";

formatJavaCode(code) {
  const formattedCode = prettier.format(code, {
    parser: "java",
    plugins: [javaPlugin],
  });
  return formattedCode;
}

在你的codemirror组件中,你可以使用这个方法来格式化你的Java代码,例如:

this.code = this.formatJavaCode(this.code);

三、踩坑场景

1. 报错 process is not defined

在这里插入图片描述
这个问题是由于在浏览器环境中,process对象是不存在的,而prettier-plugin-java在某些地方使用了process对象,导致了这个错误。

解决这个问题的一种方法是在你的webpack配置中添加一个插件,来定义process对象。你可以使用webpack.DefinePlugin来实现这个功能:

const webpack = require('webpack');

module.exports = {
  // ...
  plugins: [
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: JSON.stringify(process.env.NODE_ENV),
      },
      process: 'process/browser',
    }),
  ],
  // ...
};

这样,process对象就会被定义为process/browser,从而避免了ReferenceError: process is not defined这个错误。

另外,你也可以尝试使用prettier-plugin-java的最新版本,看看是否已经修复了这个问题。

2. 报错 browser is not defined

在这里插入图片描述
这个错误是因为process/browser被解析为process对象的browser属性,但是browser并没有被定义,所以会报错。

在webpack中定义process对象,应该使用DefinePlugin插件,将process对象的env属性设置为一个包含环境变量的对象,而不是直接将process设置为’process/browser’。

你可以修改你的webpack配置如下:

const webpack = require('webpack');

module.exports = {
  configureWebpack: {
    plugins: [
      new webpack.DefinePlugin({
        'process.env': JSON.stringify(process.env),
      }),
    ],
  },
};

这样,process.env就会被设置为一个包含所有环境变量的对象,你就可以在你的代码中使用process.env来访问环境变量了。

3. 报错 process is not defined

在这里插入图片描述
这个问题是由于在浏览器环境中,process对象是不存在的,而prettier-plugin-java在某些地方使用了process对象,导致了这个错误。

在 Vue CLI 项目中,你可以在vue.config.js文件中的configureWebpack或chainWebpack配置项中添加以下内容,来为前端代码注入process变量:

const webpack = require('webpack');

module.exports = {
  configureWebpack: {
    plugins: [
      new webpack.ProvidePlugin({
        process: 'process/browser',
      }),
    ],
  },
};

这里使用了webpack.ProvidePlugin插件,它可以将模块作为一个变量,被 webpack 在其他每个模块中引用。这样就可以在任何地方使用process变量了。

然后,你需要安装process这个npm包:

npm install --save process

这个包提供了一个全局对象,用于访问,例如,环境变量等信息。

四、安装包版本

 "prettier": "2.3.1",
 "prettier-plugin-java": "^1.6.0",
 "java-parser": "^2.0.2",
 "process": "^0.11.10",

五、写在最后

这个历程有点艰难,主要是从prettier 官网好不容易找到了能够格式化java的插件,结果弄了一遭还不能用,此文章是为了记录创作历程,呈曲折式呈现

官网地址: https://prettier.io/docs/en/plugins.html
在这里插入图片描述

结论: 这个preitter 版本和prettier-plugin-java 的版本不统一,所以即使能编译解析java语言,但做不到格式化,因为prettier-plugin-java 最新版本是1.6.0,要求的prettier是2.3.1,而prettier现在已经达到了3.x版本。 preitter 2.3.1的版本会存在一些bug

在这里插入图片描述

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 中使用 CodeMirror 可以通过两种方式:使用官方的 Vue 组件或者手动在 Vue 中创建 CodeMirror 实例。 无论哪种方式,都可以通过 CodeMirror 提供的 `autoFormatRange` 函数对文本进行格式化。下面以使用官方的 Vue 组件为例来说明如何在 Vue 中使用 CodeMirror格式化代码。 首先,在 Vue 项目中安装 CodeMirrorCodeMirrorVue 组件: ``` npm install codemirror vue-codemirror --save ``` 然后,在 Vue 中注册 CodeMirror 组件: ```javascript import Vue from 'vue' import VueCodemirror from 'vue-codemirror' import 'codemirror/lib/codemirror.css' // 引入 CodeMirror 样式文件 import 'codemirror/theme/material.css' // 引入 CodeMirror 主题文件 import 'codemirror/mode/javascript/javascript.js' // 引入 JavaScript 语法模式文件 Vue.use(VueCodemirror) ``` 在组件中使用 CodeMirror: ```html <template> <div> <codemirror v-model="code" :options="options"></codemirror> </div> </template> <script> export default { data () { return { code: '', options: { tabSize: 2, // Tab 缩进大小为 2 mode: 'javascript', // 指定语言JavaScript theme: 'material' // 指定主题为 Material } } }, methods: { format () { const editor = this.$refs.myCodeMirror.getCodeMirror() const from = editor.getCursor(true) const to = editor.getCursor(false) editor.autoFormatRange(from, to) } } } </script> ``` 以上代码中,`options` 是 CodeMirror 的配置项,`format` 方法中调用了 `autoFormatRange` 函数对文本进行格式化。需要注意的是,需要通过 `this.$refs.myCodeMirror.getCodeMirror()` 获取 CodeMirror 实例才能调用 `autoFormatRange` 函数。 当然,以上只是一个简单的示例,实际使用中可能需要根据具体需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值