如何将节点模块 CSS 捆绑到 vscode 扩展中

How to bundle node module CSS into a vscode extension

我的 Visual Studio 代码扩展使用节点模块 highlight.js,它带有一个包含 CSS 个文件的文件夹。这些为语法着色提供了配色方案。有必要捆绑一些 CSS 文件。

这是关于捆绑资产

objective 是 捆绑一个 CSS 文件并在 运行 时以字符串形式访问文件内容。如果 无需 import 语句即可实现,那将是完美的。通常,如何访问捆绑文件的内容是一个单独的问题,但我有一种感觉,内容检索和应该如何捆绑资产是紧密相关的。

我承认我对 WebPack 的理解很薄弱。

到目前为止的故事

捆绑器在 package.json 中指定为 "webpack": "^5.4.0",但我不知道如何确定实际存在的内容。可以想象我的设置有问题:当我在项目文件夹的命令提示符下尝试 运行 webpack --version 时,它响应

CLI for webpack must be installed.
  webpack-cli (https://github.com/webpack/webpack-cli)

We will use "npm" to install the CLI via "npm install -D webpack-cli".
Do you want to install 'webpack-cli' (yes/no):

第一次出现这种情况时,我回答是。经过一系列安装和另一次尝试后,同样的事情发生了。但是,vsce package 使用 webpack 进行生产构建并按 F5 成功调试将开发构建放在 dist 文件夹中并带有我可以检查的未缩小文件(这就是我知道下面提到的文件正在被捆绑)。

从那里继续我已经修改 webpack.config.js 像这样

//@ts-check

'use strict';

const path = require('path');

/**@type {import('webpack').Configuration}*/
const config = {
  target: 'node', // vscode extensions run in a Node.js-context -> https://webpack.js.org/configuration/node/

  entry: './src/extension.ts', // the entry point of this extension, -> https://webpack.js.org/configuration/entry-context/
  output: {
    // the bundle is stored in the 'dist' folder (check package.json), -> https://webpack.js.org/configuration/output/
    path: path.resolve(__dirname, 'dist'),
    filename: 'extension.js',
    libraryTarget: 'commonjs2',
    devtoolModuleFilenameTemplate: '../[resource-path]'
  },
  devtool: 'source-map',
  externals: {
    vscode: 'commonjs vscode' // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, -> https://webpack.js.org/configuration/externals/
  },
  resolve: {
    // support reading TypeScript and JavaScript files, -> https://github.com/TypeStrong/ts-loader
    extensions: ['.ts', '.js', '.css']
  },
  module: {
    rules: [
      {
        test: /\.ts$/,
        exclude: /node_modules/,
        use: [
          {
            loader: 'ts-loader'
          }
        ]
      },
      {
        test: /\.css$/,
        use: [
          'style-loader',
          'css-loader'
        ]
      }
    ]
  }
};
module.exports = config;

如您所见,有 CSS 的规则和加载程序。

当我添加这个导入时

import "../node_modules/highlight.js/styles/atelier-dune-light.css";

webpack 愉快地构建了包,当我检查它时,我可以找到捆绑的 CSS.

但是,当我尝试在扩展调试主机中加载扩展时,加载失败,并显示此消息。

Activating extension 'pdconsec.vscode-print' failed: document is not defined.

在捕获的异常上启用中断揭示了这个相当令人惊讶的异常。

Exception has occurred: Error: Cannot find module 'supports-color'
Require stack:
- c:\Users\Peter\AppData\Local\Programs\Microsoft VS Code\resources\app\node_modules.asar\get-uri\node_modules\debug\src\node.js
- c:\Users\Peter\AppData\Local\Programs\Microsoft VS Code\resources\app\node_modules.asar\get-uri\node_modules\debug\src\index.js
- c:\Users\Peter\AppData\Local\Programs\Microsoft VS Code\resources\app\node_modules.asar\get-uri\dist\index.js
- c:\Users\Peter\AppData\Local\Programs\Microsoft VS Code\resources\app\node_modules.asar\vscode-proxy-agent\out\agent.js
- c:\Users\Peter\AppData\Local\Programs\Microsoft VS Code\resources\app\node_modules.asar\vscode-proxy-agent\out\index.js
- c:\Users\Peter\AppData\Local\Programs\Microsoft VS Code\resources\app\out\bootstrap-amd.js
- c:\Users\Peter\AppData\Local\Programs\Microsoft VS Code\resources\app\out\bootstrap-fork.js

好的,激活失败,因为装载程序卡住了。但是 WTF 确实导入 CSS 与 support-color?

有关

删除导入,运行就没问题了。我真的不知道该如何回应;我不清楚为什么对样式表的需求会导致该错误。在这一点上,我向其他人寻求指导和建议。

webpack.config.js 中删除 style-loader 以修复错误。

将 CSS 拉成这样的字符串。请注意缩写路径。

const cssPath: string = "highlight.js/styles/atelier-dune-light.css";
const theCss: string = require(cssPath).default.toString();

你不需要import声明,使用require会导致Webpack打包文件,但你仍然需要删除style-loader以避免加载错误。