Как я могу использовать относительный путь модуля для клиентского скрипта от @NAmdConfig?SuiteScript 2.0 - PullRequest
0 голосов
/ 19 февраля 2019

Я хотел бы загрузить не-AMD модули (jQuery и blockUI), используя @NAmdConfig для клиентского скрипта, но в моем коде возникает ошибка в браузере.

Uncaught Ошибка: модуль не существует:../../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
});

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Я нашел обходной путь для этой проблемы, хотя он не использует относительный путь.jajo1987 рассказал мне этот трюк на Reddit, спасибо jajo1987. Reddit

Временное решение: копировать файл config.json в папку / SuiteBundles / в среде разработки.

С помощью этого трюка мне не нужно заменять путь вфайл конфигурации, когда я выпускаю пакет.

Файлы сценариев

Предполагается, что номер пакета равен 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

/ SuiteScripts / ComponentA / SuiteScript2 / FunctionA / 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
});
0 голосов
/ 19 февраля 2019

Вот так.Сначала это сложно, но как только вы его получите:

Файл конфигурации 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'},
                    ]
                });

...

...