taro-script

动态加载远程 JavaScript 脚本并执行
授权协议 MIT
开发语言 JavaScript TypeScript
所属分类 Web应用开发、 常用JavaScript包
软件类型 开源软件
地区 国产
投 递 者 燕和同
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

TaroScript

taro-script

For Taro v3:支持多端小程序动态加载远程 JavaScript 脚本并执行,支持 ES5 语法

Usage

npm install --save taro-script
import TaroScript from "taro-script";

<TaroScript text="console.log(100+200)" />;
import TaroScript from "taro-script";

<TaroScript src="https://xxxxx/xx.js">
	<View>Hello TaroScript</View>
</TaroScript>;

注 1:同一taro-script只会执行一次,也就是在componentDidMount后执行,后续改变属性是无效的。示例

function App({ url }) {
	// 只会在第一次创建后加载并执行,后续组件的更新会忽略所有属性变动
	return <TaroScript src={url} />;
}

注 2:多个taro-script会并行加载及无序执行,无法保证顺序。如:

// 并行加载及无序执行
<TaroScript  src="path1" />
<TaroScript  src="path2" />
<TaroScript  src="path3" />

如需要确保执行顺序,应该使用数组或嵌套,例如:

数组方式(建议)

<TaroScript src={["path1", "path2", "path3"]} />

或 嵌套方式

<TaroScript src="path1">
	<TaroScript src="path2">
		<TaroScript src="path3"></TaroScript>
	</TaroScript>
</TaroScript>

globalContext

内置的全局执行上下文

import TaroScript, { globalContext } from "taro-script";

<TaroScript text="var value = 100" />;

此时 globalContext.value 的值为 100

自定义context示例

import TaroScript from "taro-script";

const app = getApp();

<TaroScript context={app} text="var value = 100" />;

此时 app.value 的值为 100

TaroScript 属性

  • src

    类型:string | string[]

    要加载的远程脚本

  • text

    类型:string | string[]

    需要执行的 JavaScript 脚本字符串,text 优先级高于 src

  • context

    类型:object

    默认值:globalContext = {}

    执行上下文,默认为globalContext

  • timeout

    类型:number 默认值:10000 毫秒

    设置每个远程脚本加载超时时间

  • onExecSuccess

    类型:()=> void

    脚本执行成功后回调

  • onExecError

    类型:(err:Error)=> void

    脚本执行错误后回调

  • onLoad

    类型:() => void

    脚本加载完且执行成功后回调,text存在时无效

  • onError

    类型:(err: Error) => void

    脚本加载失败或脚本执行错误后回调,text存在时无效

  • fallback

    类型:React.ReactNode

    脚本加载中、加载失败、执行失败的显示内容

  • cache

    类型:boolean

    默认值:true

    是否启用加载缓存,缓存策略是已当前请求地址作为key,缓存周期为当前用户在使用应用程序的生命周期。

  • children

    类型:React.ReactNode | ((context: T) => React.ReactNode)

    加载完成后显示的内容,支持传入函数第一个参数为脚本执行的作用域

useScriptContext()

获取当前执行上下文 hook

import TaroScript, { useScriptContext } from "taro-script";

<TaroScript text="var a= 100">
	<Test />
</TaroScript>;

function Test() {
	const ctx = useScriptContext();
	return ctx.a; // 100
}

evalScript(code: string, context?: {})

动态执行给定的字符串脚本,并返回最后一个表达式的值

import { evalScript } from "taro-script";

const value = evalScript("100+200"); // 300

其他

  • 该组件使用eval5来解析JavaScript语法,支持 ES5

  • 上生产环境前别忘记给需要加载的地址配置合法域名

  • TaroScript 内置类型及方法:

NaN,
Infinity,
undefined,
null,
Object,
Array,
String,
Boolean,
Number,
Date,
RegExp,
Error,
URIError,
TypeError,
RangeError,
SyntaxError,
ReferenceError,
Math,
parseInt,
parseFloat,
isNaN,
isFinite,
decodeURI,
decodeURIComponent,
encodeURI,
encodeURIComponent,
escape,
unescape,
eval,
Function,
console,
setTimeout,
clearTimeout,
setInterval,
clearInterval,

内置类型和当前运行 JavaScript 环境相关,如环境本身不支持则不支持!

导入自定义方法或类型示例:

import TaroScript, { globalContext } from "taro-script";

globalContext.hello = function(){
  console.log('hello taro-script')
}

<TaroScript text="hello()"></TaroScript>;

或自定义上下文

import TaroScript from "taro-script";

const ctx = {
  hello(){
    console.log('hello taro-script')
  }
}

<TaroScript context={ctx} text="hello()"></TaroScript>;

Interface

interface TaroScriptProps<T = Record<any, any>> {
	/** 脚本执行根作用域及上下文环境 */
	context?: T;
	/** 脚本路径 */
	src?: string | string[];
	/** JavaScript字符串代码 */
	text?: string;
	/** 脚本加载并执行完后回调 */
	onLoad?: () => void;
	/** 脚本加载失败后回调 */
	onError?: (err: Error) => void;
	onExecSuccess?: () => void;
	onExecError?: (err: Error) => void;
	/** 加载脚本超时时间 */
	timeout?: number;
	/** 脚本加载中显示内容 */
	fallback?: React.ReactNode;
	/** 启用缓存 */
	cache?: boolean;
	children?: React.ReactNode | ((context: T) => React.ReactNode);
}

declare function evalScript<T extends Record<any, any>>(code: string, context?: T): any;

declare const globalContext: {};
declare function useScriptContext<T = Record<any, any>>(): T;
  • import { ComponentType } from 'react' import Taro, { Component, Config } from '@tarojs/taro' import { View, Button, Text } from '@tarojs/components' import { observer, inject } from '@tarojs/mobx' im

  • taro-script Github地址 基于Taro v3开发,支持多端小程序动态加载远程 JavaScript 脚本并执行,支持 ES5 语法 最近更新内容 新增useScriptContext获取当前执行上下文 参数名称调整:useCache -> cache 缓存策略调整 新增text属性,可直接传入js字符串 src支持数组,解决多层TaroScript嵌套问题 Usage npm i

  • 最近打开这个项目,yarn dev:weapp 时候报错,cli 和项目版本冲突如下: kyle@DESKTOP-LIPAM5T MINGW64 /d/yuwei-workspacke/web-frontend/icommunity/weapp-fontend/trunk/icommunity-weapp (master) $ yarn dev:weapp yarn run v1.22.4 $ n

  • 前言 最近有个小程序项目需要用taro-vue+ts来开发,用的是vue2,正好总结一下。 项目入口 微信开发者工具里的编译旁边可以选择入口,要能出现在那需要配置project.config.json和project.priviate.config.json字段: "miniprogram": { "list": [ { "name": "pages

  • taro的安装及使用 安装 Taro 开发工具 @tarojs/cli 使用 npm 或者 yarn 全局安装,或者直接使用npx $ npm install -g @tarojs/cli $ yarn global add @tarojs/cli 使用命令创建模板项目 $ taro init myApp 进入项目目录开始开发,可以选择小程序预览模式,或者 h5 预览模式,若使用微信小程序预览模式

 相关资料
  • 如何在Vue.js应用程序中动态加载JavaScript脚本? 以下是一个简单的解决方案: 但是第一行不加载脚本(它不向HTML添加元素)。 第二行是有效的。第二行是相同的,只是将app变量替换为纯文本(

  • 我有自己的网站,当我按下一个按钮,我想加载一个不属于我的网站(即Google.com)。当这个页面加载时,我想要执行一个脚本。 例如,单击my site上的按钮,加载Google.com并用从我的网站传递的脚本文件中的值预加载搜索栏。 如果我访问Google.com时打开developer console并输入命令,我就可以做到这一点,但是,我想自动化这一点,所以我的脚本将操作这个新页面的DOM元

  • 问题内容: 我正在一个网页上进行AJAX调用,该调用返回如下HTML块: 我正在将整个内容插入DOM,但是没有运行JavaScript。有办法运行吗? 一些细节:我无法控制脚本块中的内容(因此无法将其更改为可以调用的函数),我只需要执行整个块即可。我无法在响应中调用eval,因为JavaScript处于HTML的较大块内。我可以做某种正则表达式来分离JavaScript,然后在其上调用eval,但

  • 本文向大家介绍vue如何实现动态加载脚本,包括了vue如何实现动态加载脚本的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了vue如何实现动态加载脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天在研究,tinymce富文本编辑器怎样在vue中使用,然后看到其它框架上的使用方法,它是动态加载tinymce脚本的,若果在本地引入静态

  • 问题内容: 在HTML页面中包含JavaScript的方法有很多。我知道以下选项: 内联代码或从外部URI加载 包括在或标记[ [1],[2] ] 没有属性或属性(仅外部脚本) 包含在静态源中或由其他脚本动态添加(处于不同的解析状态,具有不同的方法) 不计算硬盘中的浏览器脚本,javascript:URI和-attributes [[3] ],已经有16种方法可以使JS执行,我敢肯定我忘了一些东西

  • 本文向大家介绍Angular-Ui-Router+ocLazyLoad动态加载脚本示例,包括了Angular-Ui-Router+ocLazyLoad动态加载脚本示例的使用技巧和注意事项,需要的朋友参考一下 在使用angular过程以前同事是采取一次性加载方式,在index页面一次性加载所有的js跟css,这种加载方式只适合教学和小型项目中,中大型不建议使用,加载速度影响到用户体验。 在使用了Ui