# Svelte Component开发初识
svelte (opens new window)框架的优点在于编译生成的代码是与框架无关的,这意味着如果使用svelte开发出来的组件可以在Vue、React等场景共用。同时svelte框架也是响应式的,简化了开发效率。
# 项目搭建
使用svelte app webpack template (opens new window)可以快速创建一个基于webpack打包工具的项目,该模板已经完成了svelte loader (opens new window)以及css相关配置。
# 模板配置的修改
# css提取
{
test: /\.css$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
hmr: !prod
}
},
'css-loader'
]
}
原模版注释中提到miniCssExtractPlugin不支持热更新,但是其CHANGELOG中0.6.0版本已经增加了该功能。通常情况下开发环境无需配置css提取,也可以继续在开发环境使用style-loader,这样就要把项目中public/index.html中引入bundle.css的一行代码去除,否则会报MIME type
不正确的错误,因为此时内存中根本没有生成css文件,而是生成在js中,动态内联到style标签。
# 分离svelte-loader配置
项目根目录新建svelte.config.js
:
// svelte.config.js
// 改配置文件目的有两个:
// 一是将 svelte-loader的options配置单独放在这里
// 二是解决vscode语法解析报错的问题
module.exports = {
// customElement: true,
generate: 'dom',
emitCss: true,
hotReload: true,
preprocess: require('svelte-preprocess')({
scss: {
includePaths: [
'node_modules/bemify/sass'
]
}
})
}
该配置文件中:
customElement
:可以指定打包的代码执行生成Web Component。generate
:可以指定打包生成的代码执行生成Dom节点。preprocess
:预处理工作,例如:scss、typescript、postcss等都可以在这里配置,详见svelte-preprocess (opens new window)。在这个配置文件中配置了scss,并且制定了bemify库的引用路径,这样只需@import '_bemify.scss'
即可。
# webpack打包输出格式
// webpack.config.js
...
module.exports = {
...
output: {
libraryTarget: 'commonjs2'
...
}
...
}
将输出格式指定为commonjs2
,在Vue等项目中就能直接import引入,例如:
// MyComponent.vue
<tempate>
<div class="svelte-component"></div>
</tempate>
<script>
import SvelteComponent from 'path/bundle.js'; // bundle.js为svelte项目打包生成的代码
export default {
mounted() {
new SvelteComponent({
target: document.querySelector('.svelte-component')
})
}
}
</script>
# 更改main.js
// main.js
import App from './App.svelte';
export default App;
# 编写并使用简单的svelte component
/!-- <svelte:options tag="svelte-component" /> 如果是web component要指定tag -->
<div>
hello world
</div>
按照上述步骤完成之后,执行npm run build
,public文件夹中将会生成bundle.js和bundle.css,你可以通过npm link的方式,也可以复制到vue项目中,然后按上述MyComponent.vue
的例子引用,将会看到页面生成hello world节点。