Каков идеальный способ загрузки normalize.css (в идеале из NPM) эффективным способом? Я хотел бы не загружать его как статический ресурс и ввести запрос заголовка только для небольшого кусочка CSS.
У Glamour есть дополнительные glamor/reset
, но это намного проще, чем нормализация, и это не то, что я ищу (я все равно не совсем уверен, как загрузить дополнительные функции в Glamour из следующего).
Вы можете использовать next/head
.
@nkzawa Я использовал next/head
для загрузки некоторых глобальных систем, но без css-loader
в проекте, как я мог потребовать файл CSS от node_modules
? И это кешируется на стороне пользователя, или это раздувает полезную нагрузку при каждом запросе заголовка?
Вы хотите определить style
как текст в next/head
, например:
<Head>
<style>{`
body {
margin: 0;
}
`}</style>
</Head>
Вам нужно будет преобразовать normalize.css
в .json
или компонент в require
, но на данный момент это будет лучший способ, IMO. Если вам требуется файл на всех страницах, то он объединяется в виде фрагмента и загружается только один раз, чтобы не раздувать полезную нагрузку.
Вы также сможете использовать css-loader
, когда будет выпущен https://github.com/zeit/next.js/pull/222 .
Спасибо. Это то, что я понял, но не знал, есть ли в настоящее время более автоматический способ загрузки. Я думаю, я мог бы запустить Webpack или Gulp локально, чтобы конвертировать, прежде чем он попадет в следующий раз.
И приятно знать, что next использует обычное разбиение на фрагменты. Теперь я чувствую себя лучше, когда пихаю вещи в голову. Спасибо за ответы на мои вопросы!
9 декабря 2016 г., в 01:11, Наоюки Канезава ( [email protected] ) написал:
Вы хотите определить стиль как текст в следующем/заголовке, например:
Вам нужно будет преобразовать normalize.css в .json или требуемый компонент, но на данный момент это будет лучший способ, IMO. Если вам требуется файл на всех страницах, то он объединяется в виде фрагмента и загружается только один раз, чтобы не раздувать полезную нагрузку.Вы также сможете использовать css-loader, когда будет выпущен # 222.
—
Вы получаете это, потому что вы создали тему.
Ответьте на это письмо напрямую, просмотрите его на GitHub или отключите ветку.
Хотел бы отметить, что гламур на самом деле использует normalize.css
, хотя и устаревшую версию v3.0.2.
https://github.com/threepointone/glamor/blob/master/src/reset.js
Сделал пулреквест
https://github.com/threepointone/гламур/тянуть/154
Простой импорт import 'glamor/reset'
работает нормально.
Не стесняйтесь использовать мой форк, если вам нужна версия 5.0, или дождитесь слияния запроса на включение :)
@FrancosLab Спасибо за совет! Я наткнулся на glamor/reset
, но не заметил, что нормализация была частью этого — я не думаю, что это упоминалось в README гламура. Спасибо за пиар!
Итак, как лучше всего это сделать прямо сейчас за [email protected]
? Я потратил несколько часов, пытаясь подражать тому, что было сделано с примером with-global-stylesheet
, но безуспешно.
Поскольку normalize.css
является пакетом, простого копирования файла недостаточно (для разрешения Node требуется package.main
). Более того, emit-file-loader
(а также file-loader
), похоже, ведет себя не так, как в репозитории примера. Кажется, что при передаче опций name=dist/[path][name].[ext]
загрузчику path
всегда начинается с -
, в результате чего файл находится в .next/dist/-/node_modules/normalize.css/normalize.css
, что является проблемой .
Способ обойти это — скопировать весь файл $#$ normalize.css
$ в папку static
или, возможно, встроить его целиком в тег style
(я использую стилизованные компоненты хотя бы для стайлинга).
Я пытался использовать webpack-copy-plugin
, но похоже, что папка static
обслуживается не из .next
, а на самом деле из самой корневой папки <root-folder>/static
(где pages
жизней), так что это тоже не сработало.
Теперь, когда Next.js не полагается на Glamour, какие-нибудь советы по дальнейшему развитию?
РЕДАКТИРОВАТЬ: Связано: https://github.com/zeit/styled-jsx/issues/83 , https://github.com/zeit/styled-jsx/pull/100 , https://github.com/zeit/ следующий.js/вопросы/544
Пример with-global-stylesheet
только что был обновлен здесь: #1327!
import 'normalize.css'
. Основная проблема заключается в том, что, поскольку Webpack не запускается на сервере, вы не можете импортировать файлы, отличные от js, в любой файл, который запускается на сервере.@migueloller , возможно, сможет переключиться на универсальный Webpack после версии 2.0...: https://github.com/zeit/next.js/issues/1245
@sedubois , с нетерпением жду этого! 😄
Вы можете добавить свой голос туда 😉
Ребята, я отлично импортировал normalize
через sass-loader
, даже без includePaths
, который только что был объединен. Все, что вам нужно сделать, это установить normalize-scss (порт Sass normalize.css
) и добавить <strong i="10">@import</strong> '~normalize-scss';
на ваш самый высокий уровень (пользовательский _document
, макет или страницу), где вы будет включать таблицу стилей $# scss
with-global-stylesheet
, как это делает with-global-stylesheet.
Теперь, если вы предпочитаете импортировать оригинал, держу пари, вы можете настроить псевдоним на node_modules
, используя babel-plugin-module-resolver
, как я только что сделал с styles
в примере, а затем импортировать его с помощью js. + <style dangerouslySetInnerHTML={{ __html: normalize }} />
.
@orlin , вы не можете просто импортировать его с помощью JS, потому что он выдаст ошибку на сервере, поскольку он не проходит через Webpack.
@migueloller , это должно работать нормально, точно так же, как scss
импортируется из js
в примере с with-global-stylesteet
. И css
, и scss
обрабатываются загрузчиками Webpack в next.config.js
и преобразуются в js. Я просто не предоставил import normalize from '...'
, так как мне нужно было бы установить normalize.css
и настроить псевдоним babel-plugin-module-resolver
, чтобы дать вам работающий путь ...
.
@орлин ,
Я клонировал пример, добавил normalize.css
и немного поиграл с ним. Вы правы, это возможно заставить это работать!
Однако мне пришлось сделать для него пользовательскую конфигурацию, где выходное имя созданного файла было dist/[path]index.js
из-за того, что если вы не скопируете package.json
, то Node require
не найдет. Поскольку вам не нужно такое поведение для других стилей (живущих в вашем исходном коде, а не node_modules
), вам необходимо настроить правило Webpack только для normalize.css (плюс другие пакеты, которые вы можете использовать).
Это работает как краткосрочное исправление, но определенно было бы неплохо иметь что-то, что работает «из коробки», как обсуждается в #1245 и https://github.com/zeit/styled-jsx/pull/100#issuecomment . -277133969
@rauchg , как вы думаете, было бы неплохо сделать пример для пакетов, которые существуют в node_modules
? Я был бы не против сделать новый пример или расширить with-global-stylesheet
.
@migueloller добавление его к тому же примеру, вероятно, было бы предпочтительнее
@migueloller Я нашел супер-чистый способ сделать это из лучших практик. Сделаю пиар на with-global-stylesheet
... Надеюсь, вы не потратили слишком много времени на его взлом.
Глобальные стили, включая сброс или нормализацию, в любом случае являются антипаттерном. Компоненты должны управлять своими собственными стилями. Normalize — это jQuery в CSS.
@jaydenseric , вы правы в том, что Normalize.css — это jQuery для CSS. Браузеры по-прежнему довольно непоследовательны в стилях HTML-элементов по умолчанию, Normalize.css помогает решить эту проблему. Normalize.css необходим для поддержки устаревших браузеров в современных проектах.
Вот подход, который я использую: (https://github.com/zeit/next.js/#custom-document)
// ./pages/_document.js
import Document, { Head, Main, NextScript } from 'next/document'
import flush from 'styled-jsx/server'
export default class MyDocument extends Document {
static getInitialProps({ renderPage }) {
const { html, head, errorHtml, chunks } = renderPage()
const styles = flush()
return { html, head, errorHtml, chunks, styles }
}
render() {
return (
<html>
<Head>
<title>My page</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css" />
</Head>
<body className="custom_class">
{this.props.customValue}
<Main />
<NextScript />
</body>
</html>
)
}
}
@vinzcelavi Почему вы сбрасываете стили?
@sospedra Понятия не имею 😬 Может быть, это поможет: https://github.com/zeit/styled-jsx#styled -jsxserver
Вероятно, вы не хотите этого делать, а вместо этого вызываете Document.getInitialProps
в соответствии с обновленной документацией: https://github.com/zeit/next.js/#custom -document
Почему нельзя поместить тег link
с URL-адресом CDN внутри тега Head
? Это сработало для меня.
@janoist1 Я думаю, проблема здесь в том, что мы хотели бы нормализовать себя из следующего, а не полагаться на внешний CDN. Это хорошо в разработке, но я не хочу полагаться на что-то внешнее в производстве.
Вот два способа решить эту проблему, если использование next-css
вам не подходит (возможно, вы используете модули CSS, поэтому импорт файла CSS из _app не будет применяться глобально).
Сначала мы включаем link
внутрь Head
для normalize.css
, а затем применяем некоторые пользовательские глобальные стили через <style type='text/css'>{globalStyles}</style>
import React from 'react'
import Document, { Head, Main, NextScript } from 'next/document'
const globalStyles = `
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
`
export default class MyDocument extends Document {
render () {
return (
<html>
<Head>
<meta name='viewport' content='width=device-width, initial-scale=1' />
<meta charSet='utf-8' />
<link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css' />
<style type='text/css'>{globalStyles}</style>
</Head>
<body>
<Main />
<NextScript />
</body>
</html>
)
}
}
Самый полезный комментарий
@jaydenseric , вы правы в том, что Normalize.css — это jQuery для CSS. Браузеры по-прежнему довольно непоследовательны в стилях HTML-элементов по умолчанию, Normalize.css помогает решить эту проблему. Normalize.css необходим для поддержки устаревших браузеров в современных проектах.