diff --git a/config/webpack.config.prod.js b/config/webpack.config.prod.js index 9bd696472..4eb3c41ed 100644 --- a/config/webpack.config.prod.js +++ b/config/webpack.config.prod.js @@ -30,9 +30,9 @@ const terserPlugin = new TerserWebpackPlugin({ terserOptions: { compress: { warnings: false, - drop_console: false, + drop_console: true, drop_debugger: true, - // pure_funcs: ['console.log'] //移除console + pure_funcs: ['console.log'] //移除console } } }); diff --git a/package.json b/package.json index 8b9a2ab15..7d6665c35 100644 --- a/package.json +++ b/package.json @@ -145,6 +145,7 @@ "scripts": { "start": "node scripts/start.js", "build": "cross-env NODE_ENV=production babel-node --max_old_space_size=15360 scripts/build.js", + "build:server": "cross-env NODE_ENV=production webpack --config config/webpack.server.js", "build:dll": "webpack --config=./config/webpack.dll.config.js", "test-build": "cross-env NODE_ENV=testBuild node --max_old_space_size=15360 scripts/build.js", "pre-build": "NODE_ENV=preBuild node --max_old_space_size=15360 scripts/build.js", diff --git a/server/index.js b/server/index.js index 9d51d9cc2..151fb1a0f 100644 --- a/server/index.js +++ b/server/index.js @@ -35,7 +35,6 @@ function excludePath(req, res, next) { app.use(excludePath); app.get('*',function (req,res) { - console.log('render', req.url) render(req,res); }) diff --git a/server/render.js b/server/render.js index cc2b16d90..3977a7330 100644 --- a/server/render.js +++ b/server/render.js @@ -9,14 +9,13 @@ import { getPathType } from './service' import { serverStore } from "../src/redux/stores/configureStore"; import App from "../src/App"; import { Route } from 'react-router-dom'; +import { setDefaultMeta } from '../src/common/UrlTool' export const render = async (req,res)=>{ let _route = null, _match = null; - const pathData = await getPathType('Eeeros') - const store = serverStore(); - + let store = serverStore(); function matchSubRoutes(routes, url) { for (const route of routes) { @@ -66,24 +65,29 @@ export const render = async (req,res)=>{ )) - - // 注入state - - let script = domObj.window.document.getElementById('initState') - if (!script) { - script = domObj.window.document.createElement('script') - script.setAttribute('id', 'initState') + if (!content) { + // 未匹配到详情页恢复默认header + setDefaultMeta() + } else { + // 匹配到服务端渲染页面注入state + let script = domObj.window.document.getElementById('initState') + if (!script) { + script = domObj.window.document.createElement('script') + script.setAttribute('id', 'initState') + } + script.textContent = `window.__initState__ = ${ JSON.stringify(store.getState()) }` + + domObj.window.document.head.appendChild(script); } - script.textContent = `window.__initState__ = ${ JSON.stringify(store.getState()) }` - - domObj.window.document.head.appendChild(script); + let html = domObj.serialize() - const prepHTML=(data,rootString)=>{ data=data.replace('
',`
${rootString}
`); return data; } res.send(prepHTML(html, content)) + + store = null } diff --git a/src/App.js b/src/App.js index 5e4e4b9e0..e42ee6dc1 100644 --- a/src/App.js +++ b/src/App.js @@ -24,6 +24,7 @@ import { SnackbarHOC } from 'educoder'; import { initAxiosInterceptors } from './AppConfig' import cookie from 'react-cookies'; import InfosIndex from './forge/users/Index' +import OrganizeIndex from './forge/Team/Index' window.marked = marked; const theme = createMuiTheme({ @@ -80,10 +81,10 @@ const http500 = Loadable({ // loading: Loading, // }) // 组织 -const OrganizeIndex = Loadable({ - loader: () => import('./forge/Team/Index'), - loading: Loading, -}) +// const OrganizeIndex = Loadable({ +// loader: () => import('./forge/Team/Index'), +// loading: Loading, +// }) const Search = Loadable({ loader: () => import('./modules/search/'), diff --git a/src/common/UrlTool.js b/src/common/UrlTool.js index a84a6a9fa..256f1fa15 100644 --- a/src/common/UrlTool.js +++ b/src/common/UrlTool.js @@ -349,12 +349,9 @@ export function setSeoMeta(keyWords, title, description, url, owner, projectId) if(projectId)keyStatement += `/${projectId}`; if (domObj) { - console.log('==================domObj===================') document = domObj.window.document - console.log('==================document===================', document.querySelector(`meta[property='og:title']`).content) } document.querySelector(`meta[property='og:title']`).content = title + keyStatement + ' for gitlink' + keyStatement + ' for git'; - console.log('==================document===================', document.querySelector(`meta[property='og:title']`).content) document.querySelector(`meta[property='og:url']`).content = window.location.origin + url; document.querySelector(`meta[property='og:description']`).content = description + ' - ' + title + ' for gitlink' + keyStatement + ' for git'; document.querySelector(`meta[property='og:image:alt']`).content = description + ' - ' + title + ' for gitlink' + keyStatement + ' for git'; @@ -373,4 +370,24 @@ export function setSeoMeta(keyWords, title, description, url, owner, projectId) if (domObj) { domObj.window.document.querySelector('meta[name="Keywords"]') } +} + +export function setDefaultMeta() { + + if (domObj) { + document = domObj.window.document + } + document.querySelector(`meta[property='og:title']`).content = 'GitLink | 确实开源'; + document.querySelector(`meta[property='og:url']`).content = 'https://gitlink.org.cn/'; + document.querySelector(`meta[property='og:description']`).content = 'GitLink,新一代开源创新服务平台 分布式协作开发 一站式过程管理 高效流水线运维 多层次代码分析 多维度用户画像 分布式协作开发 基于Git打造分布式代码托管环境'; + document.querySelector(`meta[property='og:image:alt']`).content = 'GitLink | 确实开源'; + document.querySelector('meta[name="Keywords"]').content= 'gitLink,GitLink,gitlink,git,trustie,trustieforge,forge,开源,确实开源,代码托管,Git,开源,内源,项目管理,版本控制,开源代码,代码分享,项目协作,开源项目托管,免费代码托管,Git代码托管,Git托管服务,确实让创建更美好,协同开发平台'; + document.querySelector(`meta[name='description']`).content = 'GitLink,新一代开源创新服务平台 分布式协作开发 一站式过程管理 高效流水线运维 多层次代码分析 多维度用户画像 分布式协作开发 基于Git打造分布式代码托管环境'; + document.querySelector(`meta[name='go-import']`).content ='gitlink.org.cn git https://gitlink.org.cn'; + document.querySelector(`meta[name='octolytics-dimension-user_login']`).content = 'GitLink'; + document.querySelector(`meta[name='octolytics-dimension-repository_nwo']`).content = 'GitLink'; + document.querySelector(`meta[name='octolytics-dimension-repository_network_root_nwo']`).content = 'GitLink'; + document.querySelector(`meta[name='twitter:title']`).content = 'GitLink | 确实开源'; + document.querySelector(`meta[name='twitter:description']`).content = 'GitLink,新一代开源创新服务平台 分布式协作开发 一站式过程管理 高效流水线运维 多层次代码分析 多维度用户画像 分布式协作开发 基于Git打造分布式代码托管环境'; + document.querySelector(`link[rel='canonical']`).href = 'https://gitlink.org.cn'; } \ No newline at end of file diff --git a/src/components/render-html.jsx b/src/components/render-html.jsx index 89c43ff34..b8e9aad77 100644 --- a/src/components/render-html.jsx +++ b/src/components/render-html.jsx @@ -105,7 +105,6 @@ export default ({ rs = dompurify.sanitize(rs.replace(/▁/g, "▁▁▁")) rs = rs.replaceAll('{ if(readme && readme.replace_content){ diff --git a/src/forge/Main/Detail.js b/src/forge/Main/Detail.js index 708202895..5d65547ab 100644 --- a/src/forge/Main/Detail.js +++ b/src/forge/Main/Detail.js @@ -186,7 +186,6 @@ const getBannerFunc = (owner, projectsId, isServer = false) => { class Detail extends Component { constructor(props) { super(props); - console.log('=================defaultDetail================', props.defaultDetail) this.state = { projectDetail: props.defaultDetail || undefined, isManager: false, @@ -255,12 +254,10 @@ class Detail extends Component { if (!this.props.projectBase) { const data = await getProjectFunc(owner, projectsId); - console.log('======================getProjectFunc==============') if (data.data) { this.getProject(data.data) } } else { - console.log('======================this.props.projectBase==============') this.getProject(this.props.projectBase) } } @@ -305,18 +302,14 @@ class Detail extends Component { secondSync: false, mirror_status:0 }) - console.log('==================projectMenu=========', this.props.projectMenu) this.getBanner(this.props.projectMenu) let projectdata if (this.props.defaultDetail) { - console.log('========================this.props.defaultDetail=================') projectdata = this.props.defaultDetail } else { - console.log('========================getDetailFunc=================') projectdata = await getDetailFunc(owner, projectsId, !window.location.host).data; } if (projectdata) { - console.log('========================projectdata=================') this.getDetail(projectdata) } } @@ -412,7 +405,6 @@ class Detail extends Component { data = res.data } } - console.log('=============data==============') if (data) { if (data.status === 404) { if (window.location.pathname.includes('/invite')) { diff --git a/src/forge/Team/Index.jsx b/src/forge/Team/Index.jsx index 7094a2332..f79c9d75e 100644 --- a/src/forge/Team/Index.jsx +++ b/src/forge/Team/Index.jsx @@ -39,7 +39,7 @@ const ProjectDetail = Loadable({ loader: () => import("../Main/Detail"), loading: Loading, }); -export default withRouter(CNotificationHOC()(SnackbarHOC()(TPMIndexHOC( +const team = CNotificationHOC()(SnackbarHOC()(TPMIndexHOC( ((props)=>{ console.log(456) @@ -117,4 +117,8 @@ export default withRouter(CNotificationHOC()(SnackbarHOC()(TPMIndexHOC( ) }) -)))) \ No newline at end of file +))) + +team.preFetch = ProjectDetail.preFetch + +export default withRouter(team) \ No newline at end of file diff --git a/src/forge/users/Index.jsx b/src/forge/users/Index.jsx index 1e03f51f3..305269c42 100644 --- a/src/forge/users/Index.jsx +++ b/src/forge/users/Index.jsx @@ -6,16 +6,15 @@ import { withRouter } from "react-router"; import { SnackbarHOC } from "educoder"; import { CNotificationHOC } from "../../modules/courses/common/CNotificationHOC"; import { TPMIndexHOC } from "../../modules/tpm/TPMIndexHOC"; -import ProjectDetail from "../Main/Detail"; const Infos = Loadable({ loader: () => import("./Infos"), loading: Loading, }); -// // forge项目详情 -// const ProjectDetail = Loadable({ -// loader: () => import("../Main/Detail"), -// loading: Loading, -// }); +// forge项目详情 +const ProjectDetail = Loadable({ + loader: () => import("../Main/Detail"), + loading: Loading, +}); class DetailTop extends Component { constructor(props) { diff --git a/src/modules/tpm/TPMIndexHOC.js b/src/modules/tpm/TPMIndexHOC.js index 9b9e61de6..f29b63f0b 100644 --- a/src/modules/tpm/TPMIndexHOC.js +++ b/src/modules/tpm/TPMIndexHOC.js @@ -61,8 +61,13 @@ export function TPMIndexHOC(WrappedComponent) { window.removeEventListener('keyup', this.keyupListener) } componentWillMount() { - // console.log(123) - // this.fetchUsers(); + if (!__SERVER__) { + this.fetchUsers(); + } else { + this.setState({ + current_user: {} + }) + } } componentDidMount() { @@ -166,7 +171,7 @@ export function TPMIndexHOC(WrappedComponent) { publicNav:false }) } - let url = `/api/users/get_user_info.json`; + let url = `/users/get_user_info.json`; axios.get(url).then((response) => { if (response && response.data) { this.initCommonState(response.data) @@ -289,6 +294,7 @@ export function TPMIndexHOC(WrappedComponent) { }; let path =this.props.location.pathname; let pathCheck = path.indexOf("/zone")>-1 && path.indexOf("/newdetail")>-1 && IsPC(); + console.log('+++++++++++++++++++++++++++++++fdsafgsda++++++++++++++') return (
{!publicNav &&
} { - // current_user && + current_user && this.initCommonState(user)} {...this.props} {...this.state} {...common} > diff --git a/src/services/project.js b/src/services/project.js index c29599d78..49cda3449 100644 --- a/src/services/project.js +++ b/src/services/project.js @@ -4,7 +4,6 @@ const baseUrl = 'https://www.gitlink.org.cn/api' // export async function getProjectFunc (owner, projectsId) { - console.log('4444444444444444444444444') const url = `${baseUrl}/${owner}/${projectsId}/simple.json`; return axios.get(url); }