SuperYan - nextJs https://www.hblyan.com/tag/nextJs/ 【解决方案】next.js 富文本编辑器build失败?SSR渲染引入第三方组件打包错误等@wangeditor/editor https://www.hblyan.com/archives/141.html 2023-04-10T14:43:00+08:00 背景:next.js 项目中 引入@wangeditor/editor 编辑器 在build时候,该依赖报错 ReferenceError: Element is not defined 导致无法成功发布方案:利用 dynamic 动态引入该组件取消ssr渲染,改为cli端 渲染即可应用:第三方插件不支持ssr渲染报错原来报错的代码就不写了,就是该富文本按照react的方式引入页面文件中,导致报错很明显 这个问题就是在打包的环境的中(node)中没有Element变量支持,因为这个变量在window上。解决方案// /components/MyEdit.tsx import React, { useEffect, useState } from 'react' import { Editor, Toolbar } from "@wangeditor/editor-for-react"; import { IDomEditor, IEditorConfig, IToolbarConfig, SlateDescendant } from "@wangeditor/editor"; import '@wangeditor/editor/dist/css/style.css' interface Props { html: any, setHtmlFn: any } export default function MyEditor(props: Props) { const { html, setHtmlFn } = props const [editor, setEditor] = useState<IDomEditor | null>(null); // TS 语法 useEffect(() => { return () => { if (editor == null) return; editor.destroy(); setEditor(null); }; }, [editor]); const toolbarConfig: Partial<IToolbarConfig> = {}; // TS 语法 const editorConfig: Partial<IEditorConfig> = { placeholder: "请输入内容...", }; return ( <div style={{ border: "1px solid #ccc", zIndex: 100 }}> <Toolbar editor={editor} defaultConfig={toolbarConfig} mode="default" style={{ borderBottom: "1px solid #ccc" }} /> <Editor defaultConfig={editorConfig} value={html} onCreated={setEditor} onChange={(editor: any) => setHtmlFn(editor.getHtml())} mode="default" style={{ height: "500px", overflowY: "hidden" }} /> </div> ) } // 页面代码 ... import dynamic from 'next/dynamic' const ReactWEditor = dynamic(import("../../../components/MyEditor"), { ssr: false, loading: () => <p>Loading ...</p>, }); ... const Page = () => { const [attachments, setAttachments] = useState<any[]>([]); const [html, setHtml] = useState(""); return ( <div> <ReactWEditor html={html} setHtmlFn={setHtml} /> </div> ) } 按照上述代码配置后 ,该富文本插件的代码就会在 客户端 渲染该组件就不会有打包时候的问题了。 【解决方案】如何在Next js中创建多个布局 ? 404登录注册页等 https://www.hblyan.com/archives/135.html 2023-03-25T09:52:00+08:00 背景:项目封装了全局的layout(导航顶部 以及底部),增加登录注册页面或者其他独立的页面,如何不渲染在全局的layout中?方案:在_app.js页面中 作多套渲染方案,通过getlayout 属性自定义应用:独立页面全局layoutimport React, { ReactNode } from 'react' import Footer from './MyFooter' import Header from './MyHeader' import { Layout } from 'antd' const { Content } = Layout const MLayout: React.FC<{ children: ReactNode }> = ({ children }) => { return ( <Layout> <Header /> <Content> {children} </Content> <Footer /> </Layout> ) } export default MLayout_app.tsximport '@/styles/reset.css' import '@/styles/globals.css' import type { AppProps } from 'next/app' import 'antd/dist/reset.css'; import MLayout from '../../layout'; import type { NextPage } from 'next' import type { ReactElement, ReactNode } from 'react' type NextPageWithLayout = NextPage & { getLayout?: (page: ReactElement) => ReactNode } type AppPropsWithLayout = AppProps & { Component: NextPageWithLayout } export default function App({ Component, pageProps }: AppPropsWithLayout) { const getLayout = Component.getLayout ?? ((page) => page) //是否应用页面的自定义layout 如果没有定义 则使用默认的全局layout //通常定义404 以及登录注册等 独立页面 if (Component.getLayout) return getLayout(<Component {...pageProps} />) else return <MLayout> <Component {...pageProps} /></MLayout> } 404 页面import React, { ReactNode } from 'react' export default function Index() { return ( <div> 404 </div> ) } Index.getLayout = function getLayout(page: ReactNode) { return <>{page}</> } 如果页面中 不增加自定义的getLayout 属性方法的话,就是走全局的layout渲染