Code Monkey home page Code Monkey logo

nej's Introduction

NEJ - JavaScript Framework

概述

跨平台WEB前端开发框架,主要提供Web端SDK用于开发Web应用,服务器端SDK用于整合解决方案的服务器端实现

主要特性包括:

使用

API手册

页面引入define.js,可以下载到本地也可以使用NEJ服务器上的define.js( http://nej.netease.com/nej2/src/define.js ),通过切换define.js的路径切换使用的NEJ库

<!DOCTYPE html>
<html>
  <head>
    <title>use nej</title>
    <meta charset="utf-8"/>
  </head>
  <body>
    <textarea id="txt-0"></textarea>
    <input type="text" id="input-id-0" maxlength="100"/>
    
    <script src="/path/to/nej/define.js"></script>
    <script>
      NEJ.define([
        'util/counter/counter'
      ],function(_e){
          _e._$counter('txt-0');
          _e._$counter('input-id-0');
          
          // TODO
      });
    </script>
    <script>
      // 习惯链式的同学也可以这样使用
      NEJ.define([
        'util/chain/chainable',
        'util/counter/counter'
      ],function($){
          $('#txt-0')._$counter();
          $('#input-id-0')._$counter();
          
          // TODO
      });
    </script>
  </body>
</html>

文档

nej's People

Contributors

genify avatar java0racle avatar jinze avatar leeluolee avatar nicholaslee119 avatar rainfore avatar satlxq avatar shhider avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nej's Issues

iframe跨域问题

阅读NEJ源码后,我对iframe跨域通信有点疑问。
低版本浏览器中,NEJ借助iframe进行跨域通信。 它通过iframe的name作为传输媒介,采用定时器检测 iframe name的改变实现数据传输。 假设 a.com/b.htmlc.com 发送数据,首先在 c.com 的服务器上放 nej_proxy_frame.html 这个文件,然后在 a.com/b.html 里把iframe的src设置为: c.com/res/nej_proxy_frame.htmlnej_proxy_frame.html 中会定时检测 window.name,当有数据要传给 a.com/b.html时会修改parent.name;同理 a.com/b.html 会通过定时器检测window.name和设置iframe name的变化实现数据传输。
这里有个问题是:在 a.com/b.html 里对 iframe.contentWindow.name进行赋值,会由于同源策略的安全限制抛出错误吧?
我自己做了个实验,本地通过域名绑定和Nginx代理启动了两个服务:a.com和b.com。在chrome浏览器中,把NEJ base/platform.js中的 _kernel.engine_kernel.engine 分别设置为: trident和2.0;window.postMessage设置为null。 在a.com下向b.com发送数据,会报错:
Uncaught DOMException: Blocked a frame with origin "http://www.b.com" from accessing a cross-origin frame.
低版本下IE下,不会有这个问题吗?抑或是其他问题,期盼解答,谢谢飞哥~

{}路径后面要不要跟'/'路径分隔符啊?

NEJ.define([
    'A/extend/util',
    '{A}extend/util.js'    // {A}后面没有'/'
],function(u1,u2){

    // 这里需要注意的是如果使用{A}形式需要加后缀.js
    // 这里两种方式引入的为同一个文件都是 ../web/js/extend/util.js 文件

});
NEJ.define([
    'pro/api/element',
    '{pro}/api/element.js'  // {pro}后面加了路径分隔符'/'
],function(e1,e2){

    // 以上两种方式访问的为同一个文件都是 ./api/element.js 文件

});

问题:{variable} 花括号中的路径变量后要不要路径分隔符啊?可以试出来,不过还没跑,希望文档能写清楚点。

补充,刚问了,貌似都行啊。

动画方面的问题

一开始是发现"util/animation"里面的动画通过_$stop暂停不了,查了一下,是"util/timer/animation.js"里的requestAnimationFrame方法没有return……

event.js 与 element.js 存在循环依赖

event.js 与 element.js 存在循环依赖,nej 自身对循环依赖做了兼容,只会警告,运行时正常。但是作为底层库,建议解决循环依赖的问题。

搭配babel出现的问题

我们在项目中尝试使用es6/7语法编写模块,如

define(function(){
    
	var func2 = function(){
      return new Promise((reslove)=>{
        setTimeout(function(){
          reslove(10);
        },1000)
      })
    }
    var func1 = async function(){
       var a = await func2();
       return a;
    }
    
    func1();

})

babel编译后

"use strict";

function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }

define(function () {

  var func2 = function func2() {
    return new Promise(function (reslove) {
      setTimeout(function () {
        reslove(10);
      }, 1000);
    });
  };
  var func1 = function () {
    var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
      var a;
      return regeneratorRuntime.wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              _context.next = 2;
              return func2();

            case 2:
              a = _context.sent;
              return _context.abrupt("return", a);

            case 4:
            case "end":
              return _context.stop();
          }
        }
      }, _callee, this);
    }));

    return function func1() {
      return _ref.apply(this, arguments);
    };
  }();

  func1();
});

在这个地方babel生成了一个函数_asyncToGenerator,附在模块外面。如果使用nej打包工具,这段函数**_asyncToGenerator**会被删除,对比了其他打包工具webpack以及require.js的r.js,是不会去删除该函数的,请问有什么方法能解决吗

event._$$EventTarget文档错误

发现错误链接:
http://nej.netease.com/help/event._$$EventTarget.html
错误代码片段:
image
错误现象:
原型方法__destroy中的this.__super()执行完之后,控件实例的__events属性其实就被重置为空对象了,那么onaftercycle事件也就不存在了,所以在this.__super()之后执行this._$dispatchEvent('onaftercycle')等任何触发事件的操作都是无效的,以下是我本地实验结果的截图:
image
image

搭配babel出现的问题

我们在项目中尝试使用es6/7语法编写模块,如

define(function(){
    
	var func2 = function(){
      return new Promise((reslove)=>{
        setTimeout(function(){
          reslove(10);
        },1000)
      })
    }
    var func1 = async function(){
       var a = await func2();
       return a;
    }
    
    func1();

})

babel编译后

"use strict";

function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }

define(function () {

  var func2 = function func2() {
    return new Promise(function (reslove) {
      setTimeout(function () {
        reslove(10);
      }, 1000);
    });
  };
  var func1 = function () {
    var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
      var a;
      return regeneratorRuntime.wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              _context.next = 2;
              return func2();

            case 2:
              a = _context.sent;
              return _context.abrupt("return", a);

            case 4:
            case "end":
              return _context.stop();
          }
        }
      }, _callee, this);
    }));

    return function func1() {
      return _ref.apply(this, arguments);
    };
  }();

  func1();
});

在这个地方babel生成了一个函数_asyncToGenerator,附在模块外面。如果使用nej打包工具,这段函数**_asyncToGenerator**会被删除,对比了其他打包工具webpack以及require.js的r.js,是不会去删除该函数的,请问有什么方法能解决吗

Dispatcher下的regularModule.js实现上好像有问题

嗨:
新版本(0.3+)util/dispatcher/module.js中__init方法新增了options参数,并且doBuild也加上options.config参数,但util/dispatcher/regularModule.js第165行_$$OuterModule的__init方法没有传入options方法,导致运行到module.js的__init方法第三行this.__doBuild(_options.config);报错‘Uncaught TypeError: Cannot read property 'config' of undefined’
我看到源码commit信息里‘bugfix: regularModule init options’,但这只加给了$$RegularModule类

搭配babel出现的问题

我们在项目中尝试使用es6/7语法编写模块,如

define(function(){
    
      var func2 = function(){
      return new Promise((reslove)=>{
        setTimeout(function(){
          reslove(10);
        },1000)
      })
    }
    var func1 = async function(){
       var a = await func2();
       return a;
    }
    
    func1();

})

babel编译后

"use strict";

function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }

define(function () {

  var func2 = function func2() {
    return new Promise(function (reslove) {
      setTimeout(function () {
        reslove(10);
      }, 1000);
    });
  };
  var func1 = function () {
    var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
      var a;
      return regeneratorRuntime.wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              _context.next = 2;
              return func2();

            case 2:
              a = _context.sent;
              return _context.abrupt("return", a);

            case 4:
            case "end":
              return _context.stop();
          }
        }
      }, _callee, this);
    }));

    return function func1() {
      return _ref.apply(this, arguments);
    };
  }();

  func1();
});

在这个地方babel生成了一个函数_asyncToGenerator,附在模块外面。如果使用nej打包工具,这段函数_asyncToGenerator会被删除,对比了其他打包工具webpack以及require.js的r.js,是不会去删除该函数的,请问有什么方法能解决吗

nej 引入位置的问题 - v0.2.9

<script src="/path/to/nej/define.js?pro=/src/javascript/"></script>
引入的位置放在<head></head>里面时,pro等定义的简写变量不起作用。

An unused local variable in the function _doScriptLoaded in define.js

The helper function _doScriptLoaded in define.js takes two arguments, but the second argument does not seem to be used while it is always passed every time the function is called.

The source code of the function body is below:

    /**
     * A callback function to call after a script is loaded
     *
     * @param  {Node} _script The loaded script tag
     * @param  {Boolean} _isok Whether the script is successfully loaded or not
     * @return {Void}
     */
    var _doScriptLoaded = function (_script, _isok) {
        var _uri = _doFormatURI(_script.src);

        if (!_uri) return;

        var _arr = __stack.pop();
        if (!!_arr) {
            _arr.unshift(_uri);
            _doDefine.apply(p, _arr);
        }

        if (!!_uri && __scache[_uri] != 1) {
            __scache[_uri] = 2;
        }

        _doClearScript(_script);

        _doCheckLoading();
    };

From this snippet we can see that the argument _isok is not used in any form in this function. Also, in the file define.js we can see there are several times when this function is called with two complete arguments.

E.g.

_doScriptLoaded(_script, !0);

or

_doScriptLoaded(_element, !0);

I find it really confusing. Is this a sort of intentional design with a specific purpose?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.