So here is the problem; I have an existing project which installs a private package that uses features not-yet-supported in an old version of node.
And due to the fact that @babel 7 will not transpile any files under node_modules (Maybe I need a file like .babelrc for that package?) regardless of my include or ignore configuration.
Was thinking about making my own stats page to monitor basic information for all my servers using the Primary back-end and Secondary Workers, where the Primary server will serve the front-end assets while other Worker back-ends provides API exposing the server stats.
var h = (function () {
function deref(fn) {
returnFunction.call.bind(fn);
}
var slice = deref(Array.prototype.slice);
// Lodash code starts here
var MAX_SAFE_INTEGER =9007199254740991;
function isObject(value) {
var type =typeof value;
return value !=null&& (type =='object'|| type =='function');
}
function isLength(value) {
returntypeof value =='number'&& value >-1&& value %1==0&& value <= MAX_SAFE_INTEGER;
}
function isArrayLike(value) {
return value !=null&& isLength(value.length) &&!isFunction(value);
}
function isObjectLike(value) {
return value !=null&&typeof value =='object';
}
// Lodash code ends here
function isFunction(value) {
return value instanceofFunction;
}
function makeArray(v) {
return isArrayLike(v) &&typeof v !=='string'? slice(v) : [v];
}
function isNode(el) {
return el instanceof Node;
}
function isObjectLikeNotArray(value) {
return isObjectLike(value) &&!isArrayLike(value);
}
/**
* 深度对象合并
* @param {Object} src 需要扩展的对象。
* @param {Object} [...ext] 待扩展的属性。
*/function merge(src) {
slice(arguments, 1).forEach(function (ext) {
if (isObjectLikeNotArray(ext)) {
Object.keys(ext).forEach(function (key) {
var value = ext[key];
if (isObjectLikeNotArray(value)) {
if (!src[key]) {
src[key] = {};
}
merge(src[key], value);
} else {
src[key] = value;
}
});
}
});
return src;
}
function appendChildren(container, children) {
children.forEach(function (children) {
makeArray(children).forEach(function (child) {
if (child || child ==='') {
container.appendChild(isNode(child) ? child :document.createTextNode(child));
}
});
});
return container;
}
/**
* 建立一个 HTML 元素
* @param {String|Function} tag 元素标签,或传入 Stateless 组件函数。
* @param {Object.<String.String|Bool|Number>} [attrs = {}] 元素属性集合。
* @param {Array.<String|Node>|String|Node} [...children] 子元素集合。
*/function h(tag, attrs) {
var children = slice(arguments, 2);
// Stateless 组件建立
if (isFunction(tag)) {
return tag(Object.assign({ children }, attrs));
}
var el = merge(document.createElement(tag), attrs);
return appendChildren(el, children);
}
h.Fragment =function Fragment({ children }) {
return appendChildren(document.createDocumentFragment(), children);
};
return h;
})();
/**
* 将建立的元素挂载到一个 HTML 节点 (会先暴力清空节点内容)。
* @param {HTMLElement} mnt 挂载点。
* @param {Node} node HTML 元素或节点。
*/function mount(mnt, node) {
mnt.innerHTML ='';
mnt.appendChild(node);
}
Examples
Use with pre-processor (e.g. babel)
/** @jsx h */var app = (
<section>
<h1>Test: <code>test</code></h1>
<articleclassName="post">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc quis ornare velit.</p>
<p>Nullam interdum, lorem non volutpat auctor, quam ante tempus massa, eget dignissim ligula erat non arcu.</p>
</article>
</section>
)
mount(document.getElementById("app"), app);
Without pre-processor
var app = h(
'section',
null,
h('h1', null, 'Test: ', h('code', null, 'test')),
h(
'article',
{ className:'post' },
h('p', null, 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc quis ornare velit.'),
h(
'p',
null,
'Nullam interdum, lorem non volutpat auctor, quam ante tempus massa, eget dignissim ligula erat non arcu.',
),
),
);
mount(document.getElementById('app'), app);
Stateless components
/** @jsx h */(function (root) {
function UnsafeHtml({ html }) {
var div = (<i />);
div.innerHTML = html;
return div.childNodes;
}
function ExternalLink({ className, href, children }) {
return (
<aclassName={className} href={href} target="_blank">
{children}
</a>
);
}
function Author({ author, uri }) {
var AuthorTag = uri ? ExternalLink :"i";
return (
<AuthorTagclassName="author"href={uri}>
{author ||"无名氏"}
</AuthorTag>
);
}
function Comment({ website, author, uri, text }) {
return (
<divclassName="comment">
<p>
<AuthorclassName="author"author={author} uri={website} />
(来源: <ExternalLinkhref={`https://jixun.moe`+ uri}>{uri}</ExternalLink>)
</p>
<divclassName="body">
<UnsafeHtmlhtml={text} />
</div>
</div>
);
}
function App({ comments }) {
return (
<divclassName="comments">
{comments.map(comment => (
<Comment {...comment} />
))}
</div>
);
}
var xhr =new XMLHttpRequest();
xhr.open("GET", "/latest");
xhr.onload = xhr.onerror =function () {
var data;
try {
data = JSON.parse(xhr.responseText);
mount(root, <App {...data} />);
} catch (error) {
root.textContent ="获取评论出错。";
}
}
xhr.send();
})(document.getElementById("app"));