我想使用@NAmdConfig为客户端脚本加载非AMD模块(jQuery和blockUI),但我的代码在浏览器中出错。
未捕获错误:模块不存在:../../ lib / jquery-blockUI.js
如果我使用绝对路径而不是相对路径,它可以工作。
"baseUrl": "../../lib/"
以上替换为以下,然后工作。
"baseUrl": "/SuiteScripts/ComponentA/SuiteScript2/lib/"
但是我想使用相对路径,因为这些脚本将作为捆绑包发布。
我目前解决此问题的方法是使用绝对路径,并在发布捆绑包时用路径替换路径。
有谁知道如何使用相对路径或更好的解决方案?
文件结构
SuiteScripts/
└── ComponentA/
└── SuiteScript2/
├── FunctionA/
│ ├ config.json
│ ├ Suitelet.js
│ └ ClientScript.js
└── lib/
├ jquery.min.js
└ jquery-blockUI.js
config.json
{
"baseUrl": "../../lib/",
"paths": {
"jquery": "jquery.min.js",
"blockUI": "jquery-blockUI.js"
},
"shim": {
"blockUI": ["jquery"]
}
}
Suitelet.js
/**
* @NApiVersion 2.x
* @NScriptType Suitelet
* @NModuleScope SameAccount
* @NAmdConfig ./config.json
*/
define(['N/record', 'N/url', 'N/ui/serverWidget'],
function(record, nsUrl, serverWidget) {
function onRequest(context) {
// code abbreviated
var form = serverWidget.createForm({title: 'FunctionA', hideNavBar: false});
// Set client script
form.clientScriptModulePath = './ClientScript.js';
// code abbreviated
}
})
ClientScript.js
/**
* @NApiVersion 2.x
* @NScriptType ClientScript
* @NModuleScope SameAccount
* @NAmdConfig ./config.json
*/
define(['N/runtime', 'N/url', 'blockUI'],
function (runtime, url, blockUI) {
// code using blockUI
});
像这样。一开始它很棘手,但一旦你得到它:
AMD配置文件(/SuiteScripts/MyLibs/MyLibs.config.json
):
{
"packages": [
],
"paths": {
"sugar-2.0.4.min": "SuiteScripts/MyLibs/libs/sugar-2.0.4.min",
"buckets-1.98.2.min": "SuiteScripts/MyLibs/libs/buckets-1.98.2.min",
"jquery.jexcel-1.5.7": "SuiteScripts/MyLibs/libs/jquery.jexcel-1.5.7",
"jquery.jcalendar-1.5.7": "SuiteScripts/MyLibs/libs/jquery.jcalendar-1.5.7"
}
}
以及客户端脚本中的用法
*@NApiVersion 2.x
*@NScriptType ClientScript
*@NAmdConfig /SuiteScripts/MyLibs/MyLibs.config.json
*/
define([
'N/error',
'N/search',
'sugar-2.0.4.min',
'buckets-1.98.2.min',
'jquery.jexcel-1.5.7',
'jquery.jcalendar-1.5.7',
],
function (error, search, sugar, buckets, jexcel, jcalendar) {
function pageInit(context) {
// example 1 w/ sugar.js
var num = Sugar.Number.random(1, 100);
var hm = new buckets.Dictionary();
// example 2 w/ jquery grid
jQuery('#ui-grid').jexcel({
data: data,
colHeaders: ['Country', 'Description', 'Type', 'Stock', 'Next purchase'],
colWidths: [300, 80, 100, 60, 120],
columns: [
{type: 'autocomplete', url: 'https://bossanova.uk/jexcel/countries'},
{type: 'text'},
{
type: 'dropdown',
source: [{'id': '1', 'name': 'Fruits'}, {'id': '2', 'name': 'Legumes'}, {
'id': '3',
'name': 'General Food'
}]
},
{type: 'checkbox'},
{type: 'calendar'},
]
});
...
虽然它没有使用相对路径,但我找到了解决此问题的方法。 jajo1987在Reddit上告诉我这个技巧,感谢jajo1987。 Reddit
解决方法是在开发环境中的/ SuiteBundles /文件夹下包含config.json的副本。
有了这个技巧,我在发布捆绑包时不必替换配置文件中的路径。
假设捆绑号是00000。
文件结构
├── SuiteScripts/
│ └── ComponentA/
│ └── SuiteScript2/
│ ├── FunctionA/
│ │ ├ config.json
│ │ ├ Suitelet.js
│ │ └ ClientScript.js
│ └── lib/
│ ├ jquery.min.js
│ └ jquery-blockUI.js
└── SuiteBundles/
└── Bundle 00000/
└── SuiteScript2/
└── FunctionA/
└ config.json
/suite scripts/component A/suite script2/function A/config.JSON
{
"baseUrl": "/SuiteBundles/Bundle 00000/SuiteScript2/lib/",
"paths": {
"jquery": "jquery.min.js",
"blockUI": "jquery-blockUI.js"
},
"shim": {
"blockUI": ["jquery"]
}
}
/ SuiteBundles / Bundle 00000 / SuiteScript2 / FunctionA / config.json
{
"baseUrl": "/SuiteScripts/ComponentA/SuiteScript2/lib/",
"paths": {
"jquery": "jquery.min.js",
"blockUI": "jquery-blockUI.js"
},
"shim": {
"blockUI": ["jquery"]
}
}
ClientScript.js
/**
* @NApiVersion 2.x
* @NScriptType ClientScript
* @NModuleScope SameAccount
* @NAmdConfig /SuiteBundles/ComponentA/SuiteScript2/FunctionA/config.json
*/
define(['N/runtime', 'N/url', 'blockUI'],
function (runtime, url, blockUI) {
// code using blockUI
});