javascript的Function函数

我在使用element-ui的table的控件的时候,对其中的template很好奇,使用slot-scope字段可以透传 当前row的相关信息,在react.js做列表控件的时候,就想着也实现一个类似的。

我没有仔细研究element-ui的代码是如何实现的,不过 javascript有一个Function函数,正好也在 做这个相关的功能,所以就用这个函数弄了一个类似的。

function rend_scope(t, key, slot) {
    if(!t.props['slot-scope']) {
        return (<Fragment key={key}>{React.createElement(
            t.type,
            t.props,
        )}</Fragment>);
    }
    let scope = t.props['slot-scope'];
    if(!scope.startsWith('{')) {
        let newprops = {...t.props};
        newprops[scope] = slot;
        return (<Fragment key={index2}>{React.createElement(
            t.type,
            newprops,
        )}</Fragment>);
    } else {
        let result = null;
        let looseJsonParse = (obj)=>{
            return Function('"use strict";return (' + obj + ')')()(slot);
        };
        let s = `function(${scope}=slot){return ${scope};}`;
        result = looseJsonParse(s);
        return (<Fragment key={index2}>{React.createElement(
            t.type,
            {...t.props, ...result},
        )}</Fragment>);
    }
};

上面的代码首先判断是否存在slot-scope, 不存在的话,则动态创建。

如果存在的话,则判断是否是'{‘开头的,如果不是,则是将slot的作为props指定字段的值插入,然后动态创建。

如果是'{‘开头的话,表示要提取slot中的某部分字段的内容,这些字段作为props中指定的字段和值插入,然后动态创建。 这里使用了Function的功能,首先将slot-scope中的字符串拼接为一个简单的字段提取的函数, 上面变量s中字符串 函数的功能就是提取object中指定字段的功能,虽然通过分割slot-scope中的字符串,然后对object通过 数组方式读取也可以,我还是喜欢通过Function的功能,这样如果某个字段填写有问题的话,执行到会直接报错的,报错后 位置也好找。looseJsonParse里面的功能就是生成新的js的函数并且执行,因为动态生成函数后,执行的参数是slot, 而之前s的函数就变成了是返回slot中某些字段的内容并组成新的object了,最后将这部分和老的props合并并动态生成。

第2部分的判断如果用第3部分来做的话,则是将slot的整体与老的props合并,与我想要的结果并不同。

element-ui使用 rust wasm

趁着没有忘记,赶快记录下来。

前两天试了下wasm,刚开始使用golang随便写了个,直接html加载没有问题, 但golang的版本太大了。 tinygo的版本库支持有问题。正好最近在看rust的编程。就试试rust吧。

我项目使用的是element-ui, 无它,关键是懒。里面的很多数据处理部分,vue的尿性,造成json所占的 内存过大,动不动就要500MB甚至上G的内存都很正常,没办法,我一个json原始的数据结构都要50多MB了。

目的是为了解决内存以及效率。所以试试wasm吧

首先遇到的坑:

  1. rust的编译要用下面的方式:

    wasm-pack build
    

    也就是没人的target参数为bundler的方式, 试对这一步就已经成功了一半了。我不知道其他的为啥和 element-ui有冲突,反正这个可以了。其他的我除非使用原始的html的script type=”module”去加载 等等,否则不可以

  2. 引入方式的修改 我不知道做成npm发布包会如何,我更喜欢直接copy文件夹的形式,因为我的前端和rust等各部分都是分别 在不同的docker中进行开发的,但如果import编译出来的wasm.js文件的话,会报后面提到的错误。 因此需要新建一个文件(这里是index.js),内容很简单:

    export default import('./pkg/wasm.js');
    

    引用及测试:

    import wasm from './wasm/index.js';
    (async _ => {
      const module = await wasm;         //引入wasm对象
      module.greet("aaaaaa");
    })();
    

    上面用的是rust的那个helloworld的,也是默认生成的模板代码

  3. vue.config.js的修改 碰到以下的错误:

    WebAssembly module is included in initial chunk.
    This is not allowed, because WebAssembly download and compilation must happen asynchronous.
    Add an async splitpoint (i. e. import()) somewhere between your entrypoint and the WebAssembly module:
    

    对于element-ui而言,需要在js的处理里面屏蔽掉生成的代码, vue.config.js 中chainWebpack部分添加 以下代码:

    config.module
          .rule('js')
          .exclude.add(resolve('src/wasm'))
          .end()
    
  4. 如果像我一样,使用docker部署的话,开发模式也是在docker里面的话,重启开发模式,否则vue.config.js不生效

vue中使用umd

今天在整理代码的时候,将@json-editor/json-editor升级了,升级到最新的2.2.1版本了,然后发现 很悲剧了,程序怎么也找不到JSONEditor了。我以为是我程序哪块有问题了,所以各种调查。

幸好线上版本没有做更改,结果在线上版本中发现一句window.JSONEditor=…, 然后立刻在本地查找, 发现本地更新完之后已经没有这句话了。所以可以肯定不是我程序的事情啦。

最后发现线上版本在4月7号提交了一个 Unify the format of the module to umd.的补丁, 大致从 2.1.0的版本都不支持了。

做了下测试,发现2.0.0的版本都还正常,虽然可以强制版本为2.0.0,但既然发现了,总想试着解决下。 从网上搜索”vue 无法 import umd”, 发现原来是webpack的坑。

坑找到了,就开始填坑。首先安装 @babel/plugin-transform-modules-umd:

npm i –save-dev @babel/plugin-transform-modules-umd

然后在babel.config.js的配置的plugins中添加这个插件, 类似这样:

module.exports = {
presets: [
‘@vue/app’
],
plugins:[‘@babel/plugin-transform-modules-umd’]
}