美文网首页requirejs
requirejs+jsx再会

requirejs+jsx再会

作者: 技术与健康 | 来源:发表于2018-01-27 17:15 被阅读63次

    上回项目优化中,原本是jsx文件,那么如果直接使用 jsx语法,应该也是可以的。在简书上还正好有一文章,https://www.jianshu.com/p/138b5b7b0a36,可是没跑起来,可能还是缺什么资源了。

    不过从本文描述,提到了一个重要库requirejs-react-jsx,于是就在本地,按照https://npm.taobao.org/package/requirejs-react-jsx这个上面的example试着运行,直接拷贝下来肯定不行。

    先来看看jsx语法定义的amd模块

    component.js
    
    define([
        'react'
    ],function(React){
       return React.createClass({
    
           render:function(){
    
             return(
                    <div>I am jsx component</div>
                );
           }
       })
    });
    
    app.js
    注意这里的jsx!,这是必须要的,否则不能用jsx语法
    
    define(["react","jsx!js/component","jsx!js/multi"],function(React,Component,Multi){
     
      function App() {
        this.AppView = React.createClass({
          render: function () {
            return (
              <div>
                <Component />
                <p>Hello world,hello React!</p>
              </div>
            );
          }
        });
      }
     
      App.prototype.init = function () {
        React.render(<this.AppView />, document.body);
      };
    
      return App;
    
    });
    

    另外 requirejs支持一个文件里定义多个模块,每个模块必须有name.

    multi.js
    
    define('one', function(){
    
        //console.log("i am one");
    
          function showme(){
              console.log("i am one");
          }
    
         return{
                showme:showme
        
         }
    });
    
    define('two', function(){
    
        //  console.log("i am two");
            function showme(){
              console.log("i am two");
            }
    
        return{
    
            showme:showme
        }
    });
    
    

    然后只要在页面上引用 multi.js,就可以在app.js如下访问

     注意这里的one,two是模块名
     require(['one','two'],function(one,two){
        console.log(one,two);
      });
    
    

    项目的代码已经上传
    git地址

    另外这里说下,关于require.js加载commonjs模块一说http://requirejs.org/docs/api.html#packages 如下实现

    card/main.js
    
    exports.app = function(){
        console.log('Im an application!');
    }
    
    image.png

    并不能成功加载。

    github上的一个问题
    How to load commonjs module from requirejs, document not describe clearly

    要想被requirejs加载,可以通过

    node r.js -convert path/to/commonjs/modules/ path/to/output
    进行转化

    或者进行封装如下

    define(function(require, exports, module) {
        //Put traditional CommonJS module content here
    });
    

    下面是该文https://addyosmani.com/writing-modular-js/提到的requirejs amd模块的优点

    • Provides a clear proposal for how to approach defining flexible modules.
    • Significantly cleaner than the present global namespace and <script> tag solutions many of us rely on. There's a clean way to declare stand-alone modules and dependencies they may have.
    • Module definitions are encapsulated, helping us to avoid pollution of the global namespace.
    • Works better than some alternative solutions (eg. CommonJS, which we'll be looking at shortly). Doesn't have issues with cross-domain, local or debugging and doesn't have a reliance on server-side tools to be used. Most AMD loaders support loading modules in the browser without a build process.
    • Provides a 'transport' approach for including multiple modules in a single file. Other approaches like CommonJS have yet to agree on a transport format.
    • It's possible to lazy load scripts if this is needed.

    相关文章

      网友评论

        本文标题:requirejs+jsx再会

        本文链接:https://www.haomeiwen.com/subject/sennaxtx.html