因此,在开发人员辞职后,iv'e继承了一个小故事书库,而我的网络包/故事书不是我的强项 .
问题是将Storybook构建配置为输出可导出组件是多么容易 . 我想将我的Storybook组件(不是组件的故事,而是底层组件本身)转换为私有的npm包,这样我就可以将它们导出到其他项目中 .
我的故事书是@storybook的反应3.2.11运行打字稿/ scss我文件的结构看起来像这样......
src
components
Button
Button.tsx
button.scss
Dropdown
..etc
stories
components
Buttonstory
ButtonStory.tsx
index.tsx
我的config.js看起来像这样......
import { configure } from '@storybook/react';
function loadStories() {
require('../src/stories/index.tsx');
// You can require as many stories as you need.
}
configure(loadStories, module);
我的.storybook webpack.config.js看起来像这样 .
const path = require("path");
const autoprefixer = require("autoprefixer");
const genDefaultConfig =
require('@storybook/react/dist/server/config/defaults/webpack.config.js');
const stylelint = require('stylelint');
const stylelintPlugin = require("stylelint-webpack-plugin");
module.exports = (baseConfig, env) => {
const config = genDefaultConfig(baseConfig, env);
// Reset rules
config.module.rules = [];
/**
* Typescript handling
* Allows webpack to process ts and tsx files using the typescript compiler.
*/
config.module.rules.push({
test: /\.(tsx?)$/,
enforce: "pre",
loader: require.resolve("tslint-loader")
});
config.module.rules.push({
test: /\.(tsx?)$/,
loader: require.resolve('awesome-typescript-loader')
});
config.resolve.extensions.push('.ts', '.tsx');
/**
* Style handling
*
* There are four loaders for handling the styling import process their hierachy is as follows:
*
* sass-loader -> postcss -> css-loader -> style-loader
*/
config.module.rules.push({
test: /\.(scss)$/,
use: [
require.resolve('style-loader'),
{
loader: require.resolve('css-loader'),
options: {
importLoaders: 2
}
},
{
loader: require.resolve('postcss-loader'),
options: {
ident: 'postcss',
sourceMap: true,
plugins: function plugins() {
return [
require('postcss-flexbugs-fixes'),
autoprefixer({
browsers: ['>1%', 'last 4 versions', 'Firefox ESR', 'not ie < 9'],
flexbox: 'no-2009'
})
]
}
}
},
{
loader: require.resolve('sass-loader'),
options: {
sourceMap: true
}
},
]
})
/**
* Begin storybook defaults
* These are the storybook defaults that we have not written over. Pretty much everything except
* styling loader and imports.
*/
config.module.rules = config.module.rules.concat([
{
test: /\.json$/,
loader: require.resolve('json-loader')
},
{
test: /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2)(\?.*)?$/,
loader: require.resolve('file-loader'),
query: {
name: 'static/media/[name].[hash:8].[ext]'
}
},
{
test: /\.(mp4|webm|wav|mp3|m4a|aac|oga)(\?.*)?$/,
loader: require.resolve('url-loader'),
query: {
limit: 10000,
name: 'static/media/[name].[hash:8].[ext]'
}
}
]);
/**
* Add stylelint as a plugin, doing this because you need this to run before postCSS and as of the
* of this writing I couldn't be bothered reconfiguring postCSS to process the SCSS.
*/
config.plugins.push(new stylelintPlugin({
files: "**/*.scss",
emitErrors: false,
failOnError: false
}));
return config;
};
想知道是否有人 Build 了类似的东西
1 回答
根据请求的评论,我不久前解决了这个问题,不得不学习一些webpack,但基本上最终的结果是我现在有一个故事书 - >私人npm存储库 - >其他项目管道 . 这是我如何解决它 .
.storybook .webpack.config.js就是这个 .
这将检查开发或 生产环境 版本,然后通过适当的文件运行它 . (我只是展示制作)
^上面的代码是.storybook - > webpack.prod.js基本上它的作用是覆盖故事书使用的webpack的入口点作为默认值,如果你想要故事书资产我会建议你推送到config.entry而不是覆盖它 .
webpack所做的是遍历依赖关系树,因此Main.tsx是一个单独的文件,只包含我想要导出的组件,所以我的包没有任何膨胀 .
最后还有一些小的优化来减少bundle的大小(1) - Tree Shaking删除不常的导出(2) - ExtractTextPlugin来获取一个单独的CSS文件(3) - config.externals React和ReactDOM这意味着输出包不会包含React或ReactDOM,而不是它将在您导入的项目中查找那些库<<<<(重要)
下面是Main.tsx(webpack入口点)
最后如果你在你的打字稿配置中使用commonJS,这将是你的index.js(你的NPM包需要什么)