Webflow 및 Next 통합js

34327 단어 nocodewebflownextjs

⚠️ 업데이트: 지금 발표되었습니다DesignSync.js!다음.Webflow 웹 사이트의 js 템플릿을 가져옵니다.또한 Webflow 상호 작용과 애니메이션을 지원하는 이미지를 최적화합니다.그러니 다음 아름다운 건물의 지름길을 당장 찾고 싶다면 가보시오.js 사이트!

개술


Webflow 디자이너에게는 아주 좋은 무코드 사이트 건설자입니다.작은 용례에 적합하지만 확장을 시도할 때 가끔 괴벽이 있을 수 있습니다.
  • 이미지가 뷰포트 또는 장치에 최적화되지 않음
  • 개발자가 서버측 논리를 제어할 수 없음
  • 개발자가 웹플로우의 실시간 코드를 조종할 수 없음
  • 네트워크 어플리케이션 구축이 어려움
  • ... 아직 못 본 게 많을 거예요
  • 본고에서 우리는 어떻게 사용하는지Automated Design Integration (ADI)Webflow를 연구할 것이다Next.js.만약 네가 내가 ADI patterns에 올린 댓글을 읽은 적이 있다면, 우리가 실현하고자 하는 모델은 '삽입 모드' 이다.이것은 우리가 디자인을 다른 플랫폼(즉 핵심 플랫폼)에 끼워 넣고 있다는 것을 의미한다. 따라서 디자인은 핵심 플랫폼의 일부 기능을 이용할 수 있고 이런 기능은 디자인 플랫폼에 없는 것일 수도 있다.

    이익.


    Webflow를 Next와 결합합니다.js, 우리는 기본적으로 쌍방이 모두 좋게 한다.디자이너는 웹플로우의 디자인을 완전히 제어할 수 있다.개발자는 Next의 코드를 완전히 제어할 수 있습니다.js.개발자는 다음 단계에서 그들이 필요로 할 수 있는 모든 페이지를 만들 수 있다.js는 응용 프로그램 관련 기능이나 웹 사이트에서 온 페이지 코드에 구성 요소를 삽입하는 데 사용됩니다.
    이것도 여러 개의 출처 내용을 포함하는 혼합 사이트에 적용된다.디자이너는 여전히 웹플로우에서, 개발자는Next에서fetch WordPress, Shopify, or API data 같은 작업을 할 수 있다.js는 내용을 Webflow 템플릿에 연결합니다.
    이 두 서비스는 소형 용례에 대해 모두 무료이다.그래서 만약 당신의 수요가 매우 적다면 당신은 매우 강력한 사이트를 가지고 추가 비용을 필요로 하지 않을 수 있다.
    마지막으로 우리는 일부 조정을 통해 더욱 좋은 성능과 검색엔진 최적화를 얻을 수 있다.우리 잠시 후에 다시 이야기합시다.

    결점


    지금까지 내가 발견한 유일한 진정한 단점은 웹플로우의 JS가 후속 내비게이션에 사용할 수 없다는 것이다.그래서 상호작용과 애니메이션이 계속 유효하지 않을 수도 있다.
    이것은 React에서 일하는 자신의 JS를 추가해서 해결할 수도 있고, 상호작용을 완전히 피하고 라이브러리를 사용해서 이런 일을 처리할 수도 있습니다.

    Webflow 컨텐트를 다음으로 끌어 넣습니다.js


    다음에 본 강좌는 당신이 Node.js에 대해 알고 있다고 가정할 것입니다.js와 웹플로우.나는 Yarn를 패키지 관리자로 사용하지만 npm도 가능하다.
    만약 네가 아직 없다면 먼저 네 컴퓨터에 있어create a Next.js app.만약 네가 아직 Webflow 사이트가 없다면, 하나를 만들 수도 있다.
    우선 다음 것을 찾아보자.js 프로젝트의 홈페이지는 웹플로우 홈페이지처럼 보입니다.이를 위해서는 Webflow 컨텐트를 가져와야 합니다.우리는 Axios로 이 점을 실현할 수 있다.노드가 있는 HTML을 분석하려면 Cheerio 라는 라이브러리가 필요합니다.
    다음을 설치하겠습니다.
    yarn add axios
    yarn add cheerio
    
    먼저 컨텐트를 렌더링합니다.pages/index.js 파일을 열고 내용을 다음과 같이 바꿉니다.
    // ./pages/index.js
    export default function Home(props) {
      return <div dangerouslySetInnerHTML={{ __html: props.bodyContent }} />
    }
    
    export async function getStaticProps(ctx) {
      // Import modules in here that aren't needed in the component
      const cheerio = await import(`cheerio`)
      const axios = (await import(`axios`)).default
    
      // Fetch HTML
      let res = await axios(process.env.WEBFLOW_URL).catch((err) => {
        console.error(err)
      })
      const html = res.data
    
      // Parse HTML with Cheerio
      const $ = cheerio.load(html)
      const bodyContent = $(`body`).html()
    
      // Send HTML to component via props
      return {
        props: {
          bodyContent,
        },
      }
    }
    
    Webflow URL은 환경 변수로 참조됩니다.로컬 환경에 추가하려면 프로젝트 루트에 .env.local라는 파일을 만들고 다음을 추가합니다.
    # Replace the URL with your own Webflow site; no trailing slash
    WEBFLOW_URL = "https://business-starter-template.webflow.io"
    
    현재 yarn dev 를 실행하면 내용을 볼 수 있지만, 많은 스타일이 존재하지 않습니다.이것은 우리가 <head> 내용을 불러오지 않았기 때문이다<body>.

    Webflow 컨텐트 구문 분석


    우리는 리액트dangerouslySetInnerHTML로 신체 내용물을 부을 수 있다.그러나 이것은 <head> 내용에 작용하지 않는다.HTML 문자열을 JSX가 이해할 수 있는 내용으로 변환해야 합니다.이를 위해 html-react-parser 모듈을 사용할 수 있습니다.
    yarn add html-react-parser
    
    저희가 Cheerio로 캡처<body>한 곳에서도 <head>한 내용을 받아서 아이템으로 보냅니다.
    // ./pages/index.js
    
    ...
    
    // Parse HTML with Cheerio
    const $ = cheerio.load(html)
    const bodyContent = $(`body`).html()
    const headContent = $(`head`).html()
    
    // Send HTML to component via props
    return {
      props: {
        bodyContent,
        headContent
      },
    }
    
    그리고 저희 구성 요소에서 <head> 내용을 해석하여 JSX로 변환한 다음 next/head를 사용하여 문서에 추가할 수 있습니다.
    // ./pages/index.js
    import Head from 'next/head'
    import parseHtml from 'html-react-parser'
    
    export default function Home(props) {
      return (
        <>
          <Head>
            {parseHtml(props.headContent)}
          </Head>
          <div dangerouslySetInnerHTML={{__html: props.bodyContent}} />
        </>
      )
    }
    
    ...
    
    이제 다음 페이지에서 웹플로우 사이트의 스타일 페이지를 볼 수 있을 것입니다.js 응용 프로그램.기본 pages/_app.js 파일을 삭제해야 할 수도 있습니다. 전역 스타일시트를 가져올 수도 있고, 이 스타일시트는 웹플로우 스타일시트와 충돌할 수도 있습니다.

    경로


    이 점에서 다음.js는 웹플로우가 할 수 없는 페이지에 대해 아무것도 하지 않습니다.우리는 기본적으로 웹 플로우 페이지를 원형대로 표시할 뿐이다.넥스트의 장점 중 하나는js는 클라이언트 루트입니다. 내부 내비게이션과 관련이 있을 때, 웹 사이트 응용 프로그램에 비슷한 속도를 가져다 줄 수 있습니다.다음 단계에 그것을 추가합시다.js/Webflow 프로젝트.
    색인 파일에 우리가 원하는 논리를 가지고 있기 때문에 다시 사용할 수 있습니다.그러나 다음 단계를 알려주기 위해서는 getStaticPaths 함수가 필요하다.js의 모든 가능한 경로입니다.Web915 모듈을 사용하면 이러한 웹 사이트에서 경로를 확인할 수 있습니다.설치를 시작하겠습니다.
    yarn add sitemap-links
    
    현재, 우리는 모든 다른 경로를 포착하기 위해 동적 경로를 추가해야 한다.이렇게 하면 우리는 홈페이지뿐만 아니라 모든 웹플로우 페이지를 보여줄 수 있다.우리는 pages 디렉터리에 [...path].js라는 파일을 추가해서 이를 실현할 수 있다.
    // ./pages/[...path].js
    import GetSitemapLinks from 'sitemap-links'
    import DynamicPath, { getStaticProps } from './index'
    
    export default DynamicPath
    export { getStaticProps }
    
    export async function getStaticPaths() {
      // Fetch links from Webflow sitemap
      const sitemapLink = process.env.WEBFLOW_URL + `/sitemap.xml`
      const links = await GetSitemapLinks(sitemapLink).catch((err) => {
        console.error(err)
      })
    
      // Extract paths from absolute links
      const paths = []
      for (let link of links) {
        let url = new URL(link)
        const path = url.pathname.replace(`/`, ``).split(`/`)
        if (!path.length || !path[0]) continue
        paths.push({
          params: { path },
        })
      }
    
      return {
        paths: paths,
        fallback: `blocking`,
      }
    }
    
    이제 일반적인 HTML 링크를 분석하고 Next로 변환하기 위해 index.js의 구성 요소에 추가 논리를 추가합니다.js 링크.
    // ./pages/index.js
    import Head from 'next/head'
    import Link from 'next/link'
    import parseHtml, { domToReact } from 'html-react-parser'
    import get from 'lodash/get'
    
    // Determines if URL is internal or external
    function isUrlInternal(link){
      if(
        !link ||
        link.indexOf(`https:`) === 0 ||
        link.indexOf(`#`) === 0 ||
        link.indexOf(`http`) === 0 ||
        link.indexOf(`://`) === 0
      ){
        return false
      }
      return true
    }
    
    // Replaces DOM nodes with React components
    function replace(node){
      const attribs = node.attribs || {}
    
      // Replace links with Next links
      if(node.name === `a` && isUrlInternal(attribs.href)){
        const { href, ...props } = attribs
        if(props.class){
          props.className = props.class
          delete props.class
        }
        return (
          <Link href={href}>
            <a {...props}>
              {!!node.children && !!node.children.length &&
                domToReact(node.children, parseOptions)
              }
            </a>
          </Link>
        )
      }
    
    
    }
    const parseOptions = { replace }
    
    export default function Home(props) {
      return (
        <>
          <Head>
            {parseHtml(props.headContent)}
          </Head>
          {parseHtml(props.bodyContent, parseOptions)}
        </>
      )
    }
    
    ...
    
    이것은 보기에는 많은 것 같지만, 기본적으로 어떤 <a> 링크를 찾아서 다음 링크로 바꾸는 해석 옵션만 추가합니다.js<Link>.
    URL 경로에 따라 웹 페이지만 가져오는 것이 아니라 웹 페이지를 가져오는 함수를 변경해야 합니다.
    // ./pages/index.js
    
    ...
    
    export async function getStaticProps(ctx) {
      // Import modules in here that aren't needed in the component
      const cheerio = await import(`cheerio`)
      const axios = (await import(`axios`)).default
    
    
      // Use path to determine Webflow path
      let url = get(ctx, `params.path`, [])
      url = url.join(`/`)
      if(url.charAt(0) !== `/`){
        url = `/${url}`
      }
      const fetchUrl = process.env.WEBFLOW_URL + url
    
      // Fetch HTML
      let res = await axios(fetchUrl)
        .catch(err => {
          console.error(err)
        })
      const html = res.data
    
      // Parse HTML with Cheerio
      const $ = cheerio.load(html)
      const bodyContent = $(`body`).html()
      const headContent = $(`head`).html()
    
      // Send HTML to component via props
      return {
        props: {
          bodyContent,
          headContent
        },
      }
    }
    
    이제 니 다음.js 프로그램은 모든 웹플로우를 다음 링크로 해석하고 변환할 수 있습니다.js 링크는 일반적인 웹플로우 사이트보다 페이지를 더 빨리 변환하고 보여야 합니다.

    사이트 맵 링크 고정 글꼴


    단점 부분에서 언급한 바와 같이 일부 JS는 작용하지 않는다.만약 당신의 템플릿이 구글 글꼴을 사용한다면 이것은 문제입니다.그렇다면 Google Fonts가 작은 JavaScript 세션을 사용하여 시작하기 때문에 제대로 로드되지 않았을 수도 있습니다.
    이를 위해 getStaticProps 파일에서 웹폰트를 변환하면 웹폰트를 약간 늦출 수 있습니다.
    // ./pages/index.js
    
    ...
    
    // Replaces DOM nodes with React components
    function replace(node){
      const attribs = node.attribs || {}
    
      // Replace links with Next links
      if(node.name === `a` && isUrlInternal(attribs.href)){
        const { href, ...props } = attribs
        if(props.class){
          props.className = props.class
          delete props.class
        }
        return (
          <Link href={href}>
            <a {...props}>
              {!!node.children && !!node.children.length &&
                domToReact(node.children, parseOptions)
              }
            </a>
          </Link>
        )
      }
    
      // Make Google Fonts scripts work
      if(node.name === `script`){
        let content = get(node, `children.0.data`, ``)
        if(content && content.trim().indexOf(`WebFont.load(`) === 0){
          content = `setTimeout(function(){${content}}, 1)`
          return (
            <script {...attribs} dangerouslySetInnerHTML={{__html: content}}></script>
          )
        }
      }
    
    }
    
    ...
    
    
    나는 이것이 왜 효과가 있는지 완전히 확실하지는 않지만, 확실히 효과가 있다.더 우아한 해결 방안이 있다면 댓글로 알려주세요.

    자동 통합


    통합이 자동화되지 않는 한 ADI는 그렇지 않을 것이다.우리가 진정으로 원하는 것은 다음이다.웹플로우 디자인이 바뀔 때마다 js 사이트는 자동으로 업데이트됩니다.
    Netlify는 모두 넥스트의 절호의 주최국이다.js 사이트.이 자습서에서는 Vercel을 사용하여 다음 코스를 진행합니다.js 프로젝트.아직 없으면Vercelpages/index.js를 꼬리 슬래시가 없는 Webflow 사이트 URL로 설정해야 합니다.
    Vercel 대시보드deploy your Next.js project to Vercel에서이 URL을 복사합니다.
    그리고 웹플로우 사이트의 대시보드you can create a deploy hook in the "git" section에 있습니다.트리거 유형으로 Site publish 를 선택하고 Vercel에서 가져온 URL을 Webhook URL로 붙여 넣습니다.
    Webflow 사이트가 변경 내용을 게시할 때마다 다음 변경 내용을 다시 생성하기 위해 Vercel에 알림을 보냅니다.js 프로젝트.

    통합 탭에서 Webhook URL 만들기 한층 더


    . 이것은 단지 이런 집적의 기본적인 실현일 뿐이다.우리가 어떻게 진일보한 행동을 취할 것인가에 대해 나는 몇 가지 생각이 있다.
  • Next를 사용하여 Webflow 이미지를 최적화합니다.js 이미지 모듈
  • 다음을 설정합니다.웹플로우 페이지 루트를 사용하는 js 사이트 지도
  • 다음 단계에서 작업할 수 있도록 웹플로우의 대시보드에서 만든 방향을 다시 가져옵니다.js
  • 웹플로우의 상호작용과 애니메이션이 다음 단계에서 역할을 발휘하도록 한다.js
  • 페이지 내비게이션 사이의 지속적인 눈썹/꼬리
  • 코드를 변환하여 Google Lighthouse &Core Web Vitals 지표 향상
  • 이러한 추가 기능 또는 기타 어떤 내용을 소개하고자 하신다면, 댓글로 알려 주십시오. 저는 후속 정보를 발표할 것입니다.나도 네가 무엇을 하고 있는지 알고 싶다. 이것이 무슨 도움이 될지 모른다.

    좋은 웹페이지 즐겨찾기