9

Недавно я играл с response.js, и мне нравится скорость, с которой я могу развить рабочие компоненты пользовательского интерфейса. Теперь я создал немало компонентов, и я хотел бы распространять некоторые из них среди разных .jsx-файлов.Как использовать response.js без связующего?

Все, что я прочитал, говорит о том, что при переходе на производство я должен использовать наборщик, такой как browserify или webpacker. Однако я против этой идеи. Часть причины, по которой мне нравится развиваться в javascript, - это то, что он написан на языке сценария, и компилятор не работает. Если бы я хотел пообщаться с цепочками построения и тому подобное, я бы, вероятно, просто сделал свою работу по разработке в c.

Я прежде всего делаю инженерные инструменты. Это включает в себя создание инструмента, а затем предоставление ему других инженеров и операторов. Я, вероятно, больше не буду смотреть на инструмент уже год или два. Я ожидаю, что, когда мне нужно снова взглянуть на него, или кто-то, кто после меня, должен посмотреть на него, чтобы они могли перейти прямо в исходный код и начать вносить изменения. Я не хочу вспоминать, как моя среда сборки была настроена еще в 2016 году.

Для моего конкретного приложения мне также не важно скорость загрузки или ресурсы клиента. Никто не использует мои инструменты с телефона, и инструменты редко перезагружаются.

Итак, если вы не можете убедить меня в том, что я действительно хочу расслоить, какой самый чистый способ собрать одностраничные веб-приложения с компонентами response.js, разделяемыми между несколькими файлами .jsx?


ОБНОВЛЕНИЯ/РАФИНИРОВАННЫЙ ВОПРОС/ОТВЕТ ЧАСТИЧНЫЙ:

Я начал с примером из Quick Start without NPM. Вот простой пример того, что я пытаюсь достичь:

index.html:

<html> 
    <head> 
     <meta charset="UTF-8" /> 
     <title>Hello React!</title> 
     <script src="../build/react.js"></script> 
     <script src="../build/react-dom.js"></script> 
     <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script> 
    </head> 
    <body> 
     <div id="example"></div> 
     <script type="text/babel" src="hello1.jsx"></script> 
     <script type="text/babel" src="hello2.jsx"></script> 
     <script type="text/babel"> 
      ReactDOM.render(
       <div> 
        <Hello name='Bruce'/> 
        <Hello2 name='Bruce'/> 
       </div>, 
       document.getElementById('example') 
      ); 
     </script> 
    </body> 
</html> 

hello1.jsx:

var Hello1 = React.createClass({ 
    render: function() { 
     var name = this.props.name; 
     var message = 'Hello ' + name; 
     return <h1>{message}</h1>; 
    } 
}); 

window.Hello1 = Hello1; 

hello2.jsx:

var Hello2 = React.createClass({ 
    render: function() { 
     var name = this.props.name; 
     var message = 'Hello ' + name; 
     return <p>{message}</p>; 
    } 
}); 

window.Hello2 = Hello2; 

Оказывается, что я отсутствовал в первый раз, все важные window.Hello1 = Hello1;. Эта строка предоставляет функцию глобальной области, иначе приложение сообщит об ошибке: Uncaught ReferenceError: Hello1 is not defined, потому что по умолчанию babel загружает каждый файл в свою область.

У меня все еще есть нерешенные вопросы. Теперь, благодаря некоторым полезным разъяснениям, полученным здесь, я знаю, как правильно их спросить. Во-первых, есть ли транскодер jsx, который имеет меньший вес, который не меняет видимость переменной?

Во-вторых, в моем примере babel-core/browser.js использует ajax для загрузки файла .jsx, а затем его преобразования. Однако это означает, что он не сработает при написании кода CORS при запуске локального файла, если я не запустил chrome с флагом --allow-files-access-from-files. Для этого есть элегантная работа?

Наконец, когда я пытаюсь использовать более новую версию bable-core, подобную этой: «https://cdnjs.cloudflare.com/ajax/libs/babel-core/6.1.19/browser.js», она не будет работать. Вместо этого я получаю сообщение об ошибке: browser.js:19824 Uncaught TypeError: Cannot read property 'keys' of undefined. Зачем?

+0

Довольно интересная идея. Взгляните на это: http://jamesknelson.com/learn-raw-react-no-jsx-flux-es6-webpack/ Он описывает подход к реактору, который кажется более похожим на ванильный JS, чем «современный» JS development re : транспилеры и еще много чего. Вы увидите, что он делает вызовы непосредственно в 'React.createElement (...)' как противостоящие, скажем, написанию JSX, который нуждается в транспиляции и по существу является синтаксическим сахаром для 'React.createElements' и других функций. – lux

ответ

0

Наверное, чтобы избежать использования этих инструментов, вам просто нужно включить реакцию и реакцию на свою страницу прямо перед тегом закрывающего тега вашего документа HTML вместе со всеми вашими файлами. Я считаю, что учебник на веб-сайте React использует этот подход и избегает использования каких-либо инструментов.

+0

Я не говорю об этом, но если ваши файлы имеют расширение .jsx, тогда в этом случае им понадобится стать .js-файлами, чтобы избежать оснастки. Веззи подвел итог очень хорошо. :) – Jason

4

Вы должны сделать различие, я думаю, одна вещь - это связка (webpack или браузер), инструменты, которые берут много файлов, которые составляют ваш проект и объединяют их вместе в один или несколько файлов. Эти инструменты не требуются, но они чрезвычайно полезны, если у вас есть более крупный проект.

Другие инструменты, которые часто задействованы, являются транспилерами, инструментами, которые принимают ваш код и преобразуют их в нечто другое (например, babel). Если вы используете простой старый javascript, они не требуются, если вы используете новый синтаксис ES6, вам нужны они для перевода вашего кода в старый javascript и запускать его в каждом браузере.

Это не требуется. the React tutorial включает в себя файлы непосредственно на странице, и он работает без каких-либо других инструментов, он не очень эффективен, но работает без других инструментов.

+0

Я использовал учебник. Самая большая проблема, с которой я столкнулся, заключается в том, что транспилятор, похоже, сохраняет код в отдельных файлах из глобальной области, поэтому я не понимаю, как ссылаться на компоненты, определенные в одном файле .jsx, в другом.Нужно ли использовать какой-либо вариант «module.export»? Я попытаюсь включить некоторый исходный код, когда получаю шанс. – bruceceng

+0

Я думаю, что вам просто нужно включить файлы с вашими компонентами, а затем использовать их, если вы используете компоненты ES5. – wezzy

0

В дополнение к тому, что было сказано о webpack/браузере.

Вы можете разработать свое приложение как набор отдельных компонентов и иметь возможность запускать их напрямую, без необходимости связывать их в один файл. Для этого - создайте свои компоненты с помощью модулей es6 и при необходимости импортируйте/экспортируйте их. Такие компоненты могут потребляться кем угодно, единственное, что должны делать пользователи ваших компиляторов - использовать загрузчик модулей и инициализировать его в бутстрапе приложения.

Ниже я приведу пример с использованием systemjs в качестве загрузчика, но он может в равной степени быть требованием или любым другим.

YourComponent.jsx:

export class YourComponent extends React.Component { 
    render() { 
    return <div>Hi</div>; 
    } 
} 

ReactDOM.render(<YourComponent/>, document.querySelector("#mount")); 

Он может употребляться, если в index.html systemjs настроен как:

<!doctype html> 
<html> 
<body> 
    <div id="mount"></div> 

    <script src="lib/systemjs/dist/system.src.js"></script> 

    <script> 
     System.config({ 
      paths: { 
       "react*": 'yourDistFolder/react/dist/react-with-addons', 
       "react-dom": 'yourDistFolder/react-dom/dist/react-dom' 
      }    
     }); 

     System.defaultJSExtensions = true; 
    </script> 
<!--.....--> 
    <script> 
     System.import('yourcomponent').catch(function(e) 
     { 
      console.error(e); 
     }); 
    </script> 
</body> 
</html> 

В этом примере я включил bootstraping и YourComponent фактически используется в качестве root, что, конечно, не обязательно, если оно является частью родительского приложения.

Надеюсь, это поможет.

0

Я нашел, что это самый простой способ, чтобы играть с JSX, без каких-либо шагов сборки:

<!DOCTYPE html> 
<html> 
<head> 
    <script crossorigin src="https://unpkg.com/[email protected]/umd/react.development.js"></script> 
    <script crossorigin src="https://unpkg.com/[email protected]/umd/react-dom.development.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.14.0/babel.min.js"></script> 
    <script type="text/babel" data-presets="es2017, stage-3" data-plugins="syntax-async-functions,transform-class-properties"></script> 
</head> 
<body> 
<div id="app"></div> 
<script type="text/babel" src="App.jsx"></script> 
<script type="text/babel" > 
    ReactDOM.render(<App/>, document.getElementById('app')); 
</script> 
</body> 
</html> 

и в App.jsx:

class App extends React.Component { 

    render() { 
     return <div>This is some jsx!</div>; 
    } 

}