Проект работает нормально на локальном хосте, но сборка вызывает проблемы - PullRequest
0 голосов
/ 26 апреля 2019

Я работаю над проектом Preact-CLI с Preact-Router, и он отлично работает на локальном хосте. Но производство не работает хорошо после сборки.

Я создал одностраничный объект, который динамически получает свое содержимое из файла JSON (внутри проекта, а не снаружи). Итак, я загрузил один и тот же объект страницы 2 раза для каждой отдельной страницы.

Я получаю URL страницы (используя this.props.permalink) и сравниваю его с JSONObject.title. Если они одинаковые, я хочу получить соответствующий контент JSON для отображения на странице исправления. Работает как очарование на localhost, но не в производстве.

Выпуск: Каким-то образом все страницы получают содержимое первого элемента JSON. Сначала я подумал, что это проблема с сервером, но я ошибся. Скомпилированные файлы неверны после предварительной визуализации / сборки. Таким образом, предварительно обработанный HTML-код страницы B содержит содержимое предварительно отображенной страницы A. Я предполагаю, что во время сборки this.props.permalink не работает. Как мне справиться с этим?

Дополнительная информация: Я использую функцию prerender, но не работника сервиса для сборки.

Спасибо!

UPDATE: Я переписал функцию. Я догадался, что мне нужно установить динамический контент с помощью цикла, чтобы во время сборки компилятор проходил по нему и мог предварительно обработать все страницы.

Итерация и установка состояния работают, , но сохраняется только последний элемент массива PrerenderUrls. Так что теперь все страницы получают содержимое JSON первого элемента.

componentWillMount() {


        for (var i = 0; i <= PrerenderUrls.length; i++) {

            // the code you're looking for
            let removeDash = new RegExp("-")
            var needle = PrerenderUrls[i].title
            var needle1 = needle.replace(removeDash, " ")
            alert("1")


            // iterate over each element in the array
            if (needle1 != "Homepage") {
                for (var x = 0; x < Data.length; x++) {

                    // look for the entry with a matching `code` value
                    let removeDash = new RegExp("-")
                    var nodash = Data[x].title.replace(removeDash, " ")
                    var nocaps = nodash.toLowerCase()
                    if (nocaps == needle1) {

                        alert("needle2: "+ needle1 + " nocaps: " + nocaps)
                        //alert("data "+ Data[x].title)
                        this.setState({
                            pageTitle: Data[x].title,
                            descShort: Data[x].descShort,
                            description: Data[x].desc,
                            img: Data[x].img
                        })
                        alert("state "+ this.state.pageTitle)
                    } 
                } 
            }
        }

1 Ответ

0 голосов
/ 26 апреля 2019

Из вашего описания кажется, что у вас есть стандартная проблема закрытия Javascript. Я заметил, что вы используете и let и var. Если поддерживается let, используйте его вместо var. Это автоматически решит ваши проблемы с закрытием, потому что let создает переменные с областью действия блока, а не с областью действия функции. В противном случае, вы можете попытаться повторить, как let делает это под капотом - бросить переменную в функцию обратного вызова. Что-то в строках:


    // ...
    for (var x = 0; x < Data.length; x++) {
        try { throw x }
        catch(iterator) {
            this.setState({
                pageTitle: Data[iterator].title
            });
        }
    }

PS. Очень трудно следовать вашему коду, когда он настолько специфичен для вашей функциональности. Вы могли бы упростить это и сосредоточиться на тревожном вопросе. Большая часть предоставленного вами кода не имеет отношения к вашей проблеме, но в любом случае заставляет нас проходить ее.

...