Ng-table: ํ…œํ”Œ๋ฆฟ์ด ๋กœ๋“œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 02์›” 10์ผ  ยท  7์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: esvit/ng-table

Webpack 2๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์•ฑ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. webpack 1์„ ๋กœ๋“œํ•˜๋ฉด ngtable์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ webpack 2๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋™์•ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์— GET http://app.finderbox.dev/app/ng-table/pager.html 404 (Not Found) ๋ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์„ ๋กœ๋“œํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ผ๋ถ€ ๋กœ๊ทธ ์ถœ๋ ฅ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

$templateCache.get('http://app.finderbox.dev/app/ng-table/pager.html'):  undefined
$templateCache.get('http://app.finderbox.dev/ng-table/pager.html'):  undefined
$templateCache.get('ng-table/pager.html'):  Promise {$$state: Object}

ngtable์ด ๋‹ค๋ฅธ ID๋กœ ํ…œํ”Œ๋ฆฟ์„ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
@TheLarkInn : webpack ์ธก์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?
@faceleg : ๊ท€ํ•˜์˜ ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ https://github.com/esvit/ng-table/issues/957 ?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

Webpack 2.2์—์„œ ngTable์„ ์‚ฌ์šฉํ•  ๋•Œ ์ผ๋ถ€ ๋ˆ„๋ฝ๋œ html ํ…œํ”Œ๋ฆฟ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. /bundles ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ngTable ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ํ˜„์žฌ๋กœ์„œ๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

import { ngTableModule } from 'ng-table/bundles/ng-table';

angular.module('myapp', [
    ngTableModule.name
]);

๋ชจ๋“  7 ๋Œ“๊ธ€

์ด ๋ฌธ์ œ๋Š” https://github.com/esvit/ng-table/issues/957์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ํ›จ์”ฌ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. :D

๋‚˜๋ฅผ ์œ„ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ํ…œํ”Œ๋ฆฟ์„ ์บ์‹œ์— ์ˆ˜๋™์œผ๋กœ ๋„ฃ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ng-table.js์—์„œ ์›นํŒฉ ์ƒ์„ฑ ๋ถ€๋ถ„์„ ๊ฐ€์ ธ์™€ ๋‚ด ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๊ธฐ๋Šฅ์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ๋†€๋ž๊ฒŒ๋„ ์ด์ œ console.log์—์„œ $templateCache.get('ng-table/pager.html') ์˜ ์ถœ๋ ฅ์€ ์•ฝ์†์ด ์•„๋‹ˆ๋ผ ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

/* 42 */
/* unknown exports provided */
/*!********************************!*\
  !*** ./src/browser/pager.html ***!
  \********************************/
/***/ function(module, exports, __webpack_require__) {

var path = 'ng-table/pager.html';
var html = "<div class=\"ng-cloak ng-table-pager\" ng-if=\"params.data.length\">\n    <div ng-if=\"params.settings().counts.length\" class=\"ng-table-counts btn-group pull-right\">\n        <button ng-repeat=\"count in params.settings().counts\" type=\"button\"\n                ng-class=\"{'active':params.count() == count}\"\n                ng-click=\"params.count(count)\" class=\"btn btn-default\">\n            <span ng-bind=\"count\"></span>\n        </button>\n    </div>\n    <ul ng-if=\"pages.length\" class=\"pagination ng-table-pagination\">\n        <li class=\"page-item\" ng-class=\"{'disabled': !page.active && !page.current, 'active': page.current}\" ng-repeat=\"page in pages\" ng-switch=\"page.type\">\n            <a class=\"page-link\" ng-switch-when=\"prev\" ng-click=\"params.page(page.number)\" href=\"\">&laquo;</a>\n            <a class=\"page-link\" ng-switch-when=\"first\" ng-click=\"params.page(page.number)\" href=\"\"><span ng-bind=\"page.number\"></span></a>\n            <a class=\"page-link\" ng-switch-when=\"page\" ng-click=\"params.page(page.number)\" href=\"\"><span ng-bind=\"page.number\"></span></a>\n            <a class=\"page-link\" ng-switch-when=\"more\" ng-click=\"params.page(page.number)\" href=\"\">&#8230;</a>\n            <a class=\"page-link\" ng-switch-when=\"last\" ng-click=\"params.page(page.number)\" href=\"\"><span ng-bind=\"page.number\"></span></a>\n            <a class=\"page-link\" ng-switch-when=\"next\" ng-click=\"params.page(page.number)\" href=\"\">&raquo;</a>\n        </li>\n    </ul>\n</div>\n";
var angular = __webpack_require__(/*! angular */ 0);
angular.module('ng').run(['$templateCache', function(c) { debugger; c.put(path, html) }]);
module.exports = path;

@faceleg ์ฐธ๊ณ ๋กœ

๋ฒˆ๋“ค ํฌ๊ธฐ์— ์–ด๋–ค ์˜ํ–ฅ์„ ์ค๋‹ˆ๊นŒ?

Webpack 2.2์—์„œ ngTable์„ ์‚ฌ์šฉํ•  ๋•Œ ์ผ๋ถ€ ๋ˆ„๋ฝ๋œ html ํ…œํ”Œ๋ฆฟ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. /bundles ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ngTable ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ํ˜„์žฌ๋กœ์„œ๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

import { ngTableModule } from 'ng-table/bundles/ng-table';

angular.module('myapp', [
    ngTableModule.name
]);

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @Boosten , ์ด๊ฒƒ์€ ์ €์—๊ฒŒ

๋‚˜๋„์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
'ng-table/src/browser' html ํŒŒ์ผ๊ณผ ํ•„ํ„ฐ ํด๋”๋ฅผ ๋‚ด webroot '~/ng-table/' ์˜ ng-table ํด๋”๋กœ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
webpack์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  typescript w/o ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ ์ปดํŒŒ์ผ๋œ ES5 ์•ฑ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. (๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ @types ๋””๋ ‰ํ† ๋ฆฌ ์™ธ๋ถ€์— ์žˆ์„ ๋•Œ ๋น„๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ์— ์ž…๋ ฅ์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ„์† ์•Œ์•„ ๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅ ์ค‘์ž…๋‹ˆ๋‹ค.)

๋˜ํ•œ 'ng-table/src/browser/date.html' ์ด(๊ฐ€) ์—†์Šต๋‹ˆ๋‹ค.
npm์—์„œ ng-table์„ ์„ค์น˜ํ–ˆ์œผ๋ฉฐ ๋ฒ„์ „ 3.0.1์ž…๋‹ˆ๋‹ค.

webpack.config.js ํŒŒ์ผ(Webpack 3.11.0 ์‚ฌ์šฉ)์—์„œ ๋‹ค์Œ์œผ๋กœ Webpack์„ ๊ตฌ์„ฑํ•˜์—ฌ ์ˆ˜๋™ ๋‹จ๊ณ„ ์—†์ด ํ…œํ”Œ๋ฆฟ์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

    module: {
      rules: [
        // ...
        { test: /ng-table\/.*\.html$/, use: ['ngtemplate-loader?requireAngular&relativeTo=/src/browser/&prefix=ng-table/', 'html-loader'] }
      ]
    }

๋˜ํ•œ ngtemplate-loader ๋ฐ html-loader NPM ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ ์™„๋ฃŒ๋˜๋ฉด ์ด ๊ตฌ์„ฑ์€ Webpack 3.x๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (Webpack 2.x ๋˜๋Š” 4.x์˜ ๊ฒฝ์šฐ ๋น„์Šทํ•œ ์ค„์ด ์ž‘๋™ํ•˜์ง€๋งŒ Webpack ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ์ด๋กœ ์ธํ•ด Webpack์€ ํ…œํ”Œ๋ฆฟ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด vendor.bundle.js ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.

/* 570 */
/***/ (function(module, exports, __webpack_require__) {

// Module
var code = "<div class=\"ng-cloak ng-table-pager\" ng-if=\"params.data.length\"> <div ng-if=\"params.settings().counts.length\" class=\"ng-table-counts btn-group pull-right\"> <button ng-repeat=\"count in params.settings().counts\" type=\"button\" ng-class=\"{'active':params.count() == count}\" ng-click=\"params.count(count)\" class=\"btn btn-default\"> <span ng-bind=\"count\"></span> </button> </div> <ul ng-if=\"pages.length\" class=\"pagination ng-table-pagination\"> <li class=\"page-item\" ng-class=\"{'disabled': !page.active && !page.current, 'active': page.current}\" ng-repeat=\"page in pages\" ng-switch=\"page.type\"> <a class=\"page-link\" ng-switch-when=\"prev\" ng-click=\"params.page(page.number)\" href=\"\">&laquo;</a> <a class=\"page-link\" ng-switch-when=\"first\" ng-click=\"params.page(page.number)\" href=\"\"><span ng-bind=\"page.number\"></span></a> <a class=\"page-link\" ng-switch-when=\"page\" ng-click=\"params.page(page.number)\" href=\"\"><span ng-bind=\"page.number\"></span></a> <a class=\"page-link\" ng-switch-when=\"more\" ng-click=\"params.page(page.number)\" href=\"\">&#8230;</a> <a class=\"page-link\" ng-switch-when=\"last\" ng-click=\"params.page(page.number)\" href=\"\"><span ng-bind=\"page.number\"></span></a> <a class=\"page-link\" ng-switch-when=\"next\" ng-click=\"params.page(page.number)\" href=\"\">&raquo;</a> </li> </ul> </div> ";
// Exports
var _module_exports = code;;
var path = 'ng-table/pager.html';
var angular = __webpack_require__(0);
angular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);
module.exports = path;

/***/ }),

๊ฒฝ๋กœ๊ฐ€ ng-table/pager.html ์ž„์„ ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค. relativeTo=/src/browser/ ์›นํŒฉ์˜ ๊ตฌ์„ฑ์˜ ์ผ๋ถ€๊ฐ€ ํšŒ์ „ node_modules/ng_table/src/browser/pager.html ๋กœ pager.html ๋‹ค์Œ๊ณผ prefix=ng-table/ ๊ฐ€์‚ฐ ng-table ํ”„๋ฆฌํ”ฝ์Šค ์ด๋ฆ„์— ํ•ด๋‹น ngtemplate- ๋กœ๋”๋Š” ๊ทธ๊ฒƒ์„ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ Angular์˜ ํ…œํ”Œ๋ฆฟ ์บ์‹œ์— ng-table/pager.html ํ…œํ”Œ๋ฆฟ์ด ๋ฏธ๋ฆฌ ๋กœ๋“œ๋˜๋ฏ€๋กœ ng-table ์ฝ”๋“œ๊ฐ€ ng-table/pager.html ํ…œํ”Œ๋ฆฟ์„ ์š”์ฒญํ•˜๋ฉด Angular๊ฐ€ ์ด๋ฅผ ์ฐพ์•„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰