Next.js如何引入百度分享(外部引用)类似的外部js,以及如何操作window

前言

近期使用React官方推荐的服务端渲染工具Next.js进行服务端页面编程时遇到引入百度分享等外部JS文件的问题。

Next.js可以使用内置组件来装在 <head> 到页面中

import Head from 'next/head'

export default () =>
  <div>
    <Head>
      <title>My page title</title>
      <meta name="viewport" content="initial-scale=1.0, width=device-width" />
    </Head>
    <p>Hello world!</p>
  </div>

那么我们就可以用这个特性引入外部js文件了,下面是引入百度分享的例子:

import Head from 'next/head'

export default () =>
 <div>
  <Head>
  <title>My page title</title>
  <meta name="viewport" content="initial-scale=1.0, width=device-width" />
	<script>
	    {
	    `             
	with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
	`
		}
	
	</script>
</Head>
 </div>

这样就很好解决了怎么引入类似百度分享一类的外部js文件的问题,但是百度分享自身会存在一个问题:百度分享异步操作加载进页面的时候不会立即渲染,因为因为百度分享执行后,会创建全局的window.__bd_share_main,所以 需要在 ajax请求完成后执行一下window.__bd_share_main.init();

但是由于window操作是客户端行为,而Next.js自身是服务端渲染(SSR)的原因是没有window对象的,解决办法是利用Next.js动态导入,官方文档有说明,动态导入是可以禁止SSR的,如下:

import dynamic from 'next/dynamic'

const DynamicComponentWithNoSSR = dynamic(import('../components/hello3'), {
  ssr: false
})

export default () =>
  <div>
    <Header />
    <DynamicComponentWithNoSSR />
    <p>HOME PAGE is here!</p>
  </div>

像官方文档一样动态引入百度分享所在组件即可解决问题了

// 禁止ssr
const ShareCol = dynamic(import('../components/sharecol'),{ssr:false})

百度分享组件中,在componentDidMount钩子函数中操作如下

componentDidMount(){
 
    if(window._bd_share_main){         
        window._bd_share_main.init();
    }    
   
   
}

其他类似的外部引入问题也可以这样解决

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值