我们正在构建一个 React 组件,用于将代码片段嵌入 Docusaurus2 页面。该组件使用本地 CSS 文件(它是Prism CSS的修改版本)来突出显示代码片段上的语法。该组件随后作为 NPM 包发布。
将我们的包导入我们的 Docusaurus2 项目时,我们在服务器构建中收到以下错误:ReferenceError: document is not defined
经过调查,似乎 Docusaurus 无法使用本地 CSS 文件或任何本地 CSS 文件。
如果我们将Prism CSS直接导入到我们的组件中,import "prismjs/themes/prism.css";
而不是使用 导入本地 CSS 文件import "./prism.css"
,则不会出现构建问题。
我们尝试了什么:
- 我们尝试使用MiniCssExtractPlugin,但最终代码片段中没有更多高亮显示。
- 我们的临时解决方案是创建一个仅包含 css 文件的 npm 包并将其导入到我们的 React 组件中。通过这样做,项目中不再有构建错误。
以下是我们组件中的文件示例:
webpack.config.js:
const path = require('path');
const nodeExternals = require("webpack-node-externals");
module.exports = {
mode: 'production',
entry: './src/index.tsx',
output: {
path: path.resolve('lib'),
filename: 'index.js',
libraryTarget: 'commonjs2'
},
module: {
rules: [
{
test: /\.(t|j)sx?$/,
exclude: /(node_modules)/,
use: 'babel-loader'
},
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
]
},
externals: [nodeExternals()],
resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx']
},
}
editor.tsx(prism.css 是上面讨论的 css 文件):
import React from 'react';
import Prism from 'prismjs';
import { ReactCodeJar } from "react-codejar";
import "./prism.css";
import axios from 'axios';
import YAML from 'yaml';
let darkTheme = {
editorStyle: {
borderRadius: "25px 25px 25px 0",
boxShadow: "0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2)",
fontFamily: "'Source Code Pro', monospace",
fontSize: "14px",
fontWeight: "400",
height: "350px",
letterSpacing: "normal",
lineHeight: "20px",
padding: "20px",
tabSize: "4",
...
包.json:
{
"name": "ligosnippet",
"version": "1.0.0",
"main": "./lib/index.js",
"scripts": {
"build": "webpack"
},
"files": [
"lib"
],
"license": "ISC",
"peerDependencies": {
"react": "^16.13.1",
"react-dom": "^16.13.1"
},
"devDependencies": {
"@babel/cli": "^7.8.4",
"@babel/core": "^7.8.7",
"@babel/plugin-transform-react-jsx": "^7.8.3",
"@babel/preset-env": "^7.8.7",
"@babel/preset-react": "^7.8.3",
"@babel/preset-typescript": "^7.8.3",
"@types/node": "^13.9.5",
"@types/react": "^16.9.23",
"@types/react-dom": "^16.9.5",
"@types/styled-components": "^5.0.1",
"babel-loader": "8.0.6",
"css-loader": "^3.4.2",
"parcel-bundler": "^1.12.4",
"path": "^0.12.7",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"style-loader": "^1.1.3",
"typescript": "^3.8.3",
"webpack": "4.41.5",
"webpack-cli": "^3.3.11",
"webpack-node-externals": "^1.7.2"
},
"dependencies": {
"axios": "^0.19.2",
"prismjs": "^1.20.0",
"react-codejar": "^1.0.1",
"yaml": "^1.9.2"
}
}
.babelrc:
{
"presets": [
"@babel/preset-react",
"@babel/preset-env",
"@babel/preset-typescript"
],
"plugins": ["@babel/plugin-transform-react-jsx"]
}