Я новичок как в Polymer, так и в Webpack и пытаюсь понять, как заставить полимерный webpack-загрузчик правильно перемещаться.Согласно новому способу импорта HTML-кода в JS в Polymer 3.x (наоборот, в Polymer 2.x) я создал отдельный файл .html и пытаюсь импортировать его в мой класс extends PolymerElement.
Вот мой простой файл template.html:
<div>This is my chosen colour: [[colour]] (Made by the [[name]] app)</div>
Вот мой файл Polymer index.js:
import { PolymerElement, html } from '@polymer/polymer';
import * as view from './template.html';
export class NpsWidget extends PolymerElement {
static get is() { return 'nps-widget'; }
// Define a string template instead of a `<template>` element.
static get template() {
return html(`${view}`);
}
constructor() {
super();
this.name = 'Polymer 3.0 test';
console.log(this.name + ' constructor run successfully.');
}
static get properties() {
return {
name: {
type: String
},
colour: {
type: String,
value: '#777777'
}
};
}
}
customElements.define(NpsWidget.is, NpsWidget);
А вот мой файл конфигурации webpack:
const path = require('path');
const webpack = require('webpack');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const pkg = require(path.resolve(__dirname, '../package.json'));
let libraryName = pkg.name;
const config = {
mode: 'development',
entry: path.resolve(__dirname, '../src/index.js'),
devtool: 'source-map',
output: {
globalObject: 'typeof self !== \'undefined\' ? self : this',
path: path.resolve(__dirname, '../lib/dev'),
filename: libraryName + '.js',
library: libraryName,
libraryTarget: 'umd',
umdNamedDefine: true
},
module: {
rules: [
{
test: /\.html$/,
use: [
// Chained loaders are applied last to first
{ loader: 'babel-loader' },
{ loader: 'polymer-webpack-loader' }
]
},
{
test: /\.js$/,
// We need to transpile Polymer itself and other ES6 code
// exclude: /(node_modules)/,
use: {
loader: 'babel-loader',
options: {
presets: [[
'env',
{
targets: { browsers: ['last 2 Chrome versions', 'Safari 10'] },
debug: true
}
]],
plugins: [['transform-object-rest-spread', { useBuiltIns: true }]]
}
}
},
// all files with a `.ts` or `.tsx` extension will be handled by `ts-loader`
{
test: /(\.tsx|\.ts)$/,
loader: 'ts-loader',
exclude: /node_modules/
}
]
},
resolve: {
modules: [path.resolve(__dirname, '../node_modules'), path.resolve(__dirname, '../src')],
extensions: ['.ts', '.tsx', '.json', '.js', '.html']
},
plugins: [
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: 'static',
ignore: ['.*']
},
{
from: path.resolve(__dirname, '../node_modules/@webcomponents/webcomponentsjs/webcomponents-loader.js')
},
{
from: path.resolve(__dirname, '../node_modules/@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js')
}
])
]
};
module.exports = config;
Результат, который я получаю, заключается в том, что оператор import в template.html, похоже, просто создает тег div в комплекте сценариев и включает его в документ иКонечно, класс не может найти значение ... Вот вывод:
Это мой выбранный цвет: [[color]] (Сделано приложением [[name]])
undefined
Если я включу шаблон в буквальную строку HTML в файле JS и удалю оператор импорта, он будет работать нормально:
//import * as view from './template.html';
...
return html`<div>This is my chosen colour: [[colour]] (Made by the [[name]] app)</div>`;
Этомой выбранный цвет: # 777777 (Сделано в тестовом приложении Polymer 3.0)
Может кто-нибудь помочь мне понять, как заставить это работать?Я подозреваю, что это какая-то конфигурация для полимерного веб-загрузчика.Этот стиль кода прекрасно работает в ванильном приложении Polymer, которое не поставляется Webpack.
Спасибо,
Пол