7

С React Starter Kit, я добавляю Material UI следующим образом:Реагировать Starter Kit и материал интерфейса: UserAgent должны быть поставлены в контексте muiTheme для серверной части рендеринга

npm install material-ui --save 

и следующий импорт в качестве компонента:

import RaisedButton from 'material-ui/lib/raised-button'; 

и:

<RaisedButton label="Default" /> 

Я получаю следующее сообщение об ошибке:

Warning: Material-UI: userAgent should be supplied in the muiTheme context for server-side rendering.

Согласно Материал UI, documentation, он говорит, что я должен был бы обратить внимание на три вещи:

  1. autoprefixer и агент пользователя
  2. process.env.NODE_ENV

Что код, который я должен ввести и где именно, в частности, с помощью набора для запуска React Starter Kit?

P.S. this solution не работает для меня: -/

ответ

3

Это работает для меня. Добавьте к этому server.js:

global.navigator = { userAgent: 'all' }; 

Затем убедитесь, что вы видите несколько префиксов поставщика, используемые как в этом Screengrab показывая -webkit и -ms как используется:

enter image description here

+1

Это решение приведет к недопустимой контрольной сумме и 'display: -webkit-box, -moz-box, -ms-flexbox ...' , пожалуйста, будьте осторожны, сейчас это нарушит поведение вашего клиента для поддержки встроенного префикса стиля, которому доверяют userAgent –

+0

Да @IdanGozlan, я думаю, [это решение] (http://stackoverflow.com/a/43958563/6226738) лучше. –

3

Попробуйте добавить global.navigator = { userAgent: 'all' }; в начало вашего файла server.js (точка входа в Node.js).

+0

Спасибо. Я попытался добавить, что в самом верхнем (1-м строчке) 'server.js' и снова после импорта все еще получает такое же предупреждение. – bjfletcher

+0

Я просмотрел код и заметил, что нам понадобится 'global.navigator.userAgent = 'all'' не' global.navigator =' ''или' global.navigator =' all''. Упомянем об этом в дискуссии GitHub. – bjfletcher

3

Это должно исправить это

import themeDecorator from 'material-ui/lib/styles/theme-decorator'; 
import RaisedButton from 'material-ui/lib/raised-button'; 
import getMuiTheme from 'material-ui/lib/styles/getMuiTheme'; 

class MyComponent extends Component { 
render() { 
    return (<RaisedButton label="Default" />); 
    } 
} 

export default themeDecorator(getMuiTheme(null, { userAgent: 'all' }))(MyComponent); 
+0

Мне сказали использовать MuiThemeProvider, потому что themeDecorator устарел. –

+1

Я согласен с тем, что вы должны использовать 'MuiThemeProvider', но' getMuiTheme (null, {userAgent: 'all'}) 'все еще работает, по-моему, это более элегантно, чем объявление глобальной переменной. –

+0

Привет @RomanStarkov и GiladArtzi, я думаю, вы можете это сделать [таким образом] (http://stackoverflow.com/a/43958563/6226738). –

5

When using Material-UI with server rendering, we must use the same environment for the server and the client. This has two technical implications.

, как вы видели на MaterialUI documentation страница

Вам необходимо предоставить тот же пользовательский агент как для контекста сервера, так и для браузера, как вы видели его в документации, но я категорически препятствую вам предоставлять «все» пользовательский агент, поскольку вы будете обслуживать много ненужного кода для своего конечный пользователь.

Вместо этого вы можете легко следить за документом MaterialUI и передавать значение пользовательского агента, содержащееся в http request headers.

С заявленными или коа сервер

global.navigator = global.navigator || {}; 
global.navigator.userAgent = req.headers['user-agent'] || 'all'; 

Я просто проверил it has been added to the ReactStarterKit (не проверял сам) в src/server.js

global.navigator = global.navigator || {}; 
global.navigator.userAgent = global.navigator.userAgent || 'all'; 
+0

Это будет абсолютно * не * корректно работать на стороне сервера, поскольку узел может одновременно обслуживать несколько запросов (для разных браузеров), тем самым переписывая глобальное значение 'global.navigator' как неправильное среднее время цикла. – Matthematics

0

Если вы используете сервер KoaJS вы должны установить koa-useragent, а затем использовать это до рендеринга на стороне сервера:

global.navigator = global.navigator || {}; 
    global.navigator.userAgent = this.state.userAgent.source || 'all'; 

Это сработало для меня!

2

Рабочим (и надёжным) решение для меня коротко и просто:

getMuiTheme({userAgent: (typeof navigator !== 'undefined' && navigator.userAgent) || 'all' }) 

Пример (из моего тестового приложения):

<MuiThemeProvider muiTheme={getMuiTheme({userAgent: (typeof navigator !== 'undefined' && navigator.userAgent) || 'all' })}> 
    <Provider store={store}> 
     <MyApplication/> 
    </Provider> 
</MuiThemeProvider> 
+1

Это решение является неполным, выбрасывает ReferenceError: навигатор не определен –

+0

Неверно. 'ReferenceError: navigator не определен' – Green

+0

Привет @ThomasModeneis и Green, я думаю, что это решение правильно и работает тоже: http://stackoverflow.com/a/43958563/6226738 –