Статьи были включены вgithub, Добро пожаловать в Watch and Star.
Введение
От реализации базовой структуры проекта -> поддержки мультистандартной упаковки -> реализации загрузки по требованию -> публикации пакетов npm вам потребуется создать библиотеку компонентов от 0 до 1.
Построить проект
-
Инициализировать каталог проекта
mkdir lyn-comp-lib && cd lyn-comp-lib && npm init -y -
Создайте новый каталог пакетов
Каталог пакетов — это каталог компонента, компонент — это папка, а папка — это компонент
mkdir packages -
Новый /src/index.js
/src/index.js как запись упаковки для спецификации commonjs
mkdir src && cd src && touch index.js -
Новый webpack.common.js
файл конфигурации webpack для спецификации commonjs
touch webpack.common.js -
Новый webpack.umd.js
специфичный для umd файл конфигурации веб-пакета
touch webpack.umd.js -
Новый опубликовать.sh
Отвечает за создание проектов и публикацию пакетов npm.
touch publish.sh -
Установить вебпак, webpack-cli
npm i webpack webpack-cli -D
Структура каталогов проекта
начать кодирование
В настоящее время мы просто проверяем дизайн архитектуры, поэтому мы напишем только несколько простых демонстраций.
компоненты
Создайте два новых каталога в каталоге пакетов в качестве каталогов компонентов.
На самом деле эта структура каталогов относится к библиотеке компонентов element-ui в рамках подготовки к поддержке загрузки по запросу.
- /packages/hello/src/index.js
// hello function
export default function hello (msg) {
console.log('hello ', msg)
}
- /packages/log/src/index.js
// log function
export default function log (str) {
console.log('log: ', str)
}
Импорт и экспорт компонентов
Внедряйте и экспортируйте компоненты проекта единообразно в /src/index.js.
// 当组件变得庞大时这部分可自动生成,element-ui 就是采用自动生成的方式
import hello from '../packages/hello/src/index'
import log from '../packages/log/src/index'
export default {
hello,
log
}
Напишите файл конфигурации веб-пакета
-
/webpack.common.js
const path = require('path') module.exports = { entry: './src/index.js', // 使用 开发者 模式,目的是为了一会儿的调试,实际开发中可改为 production mode: 'development', output: { path: path.join(__dirname, './lib'), filename: 'lyn-comp-lib.common.js', // commonjs2 规范 libraryTarget: 'commonjs2', // 将 bundle 中的 window 对象替换为 this,不然会报 window is not defined globalObject: 'this', // 没有该配置项,组件会挂载到 default 属性下,需要 comp.default.xxx 这样使用,不方便 libraryExport: 'default' } } -
/webpack.umd.js
const path = require('path')
module.exports = {
// 实际开发时这部分可以自动生成,可采用 element-ui 的方式
// 按需加载 需要将入口配置为多入口模式,一个组件 一个入口
entry: {
log: './packages/log/src/index.js',
hello: './packages/hello/src/index.js'
},
mode: 'development',
output: {
path: path.join(__dirname, './lib'),
filename: '[name].js',
// umd 规范
libraryTarget: 'umd',
globalObject: 'this',
// 组件库暴露出来的 全局变量,比如 通过 script 方式引入 bundle 时就可以使用
library: 'lyn-comp-lib',
libraryExport: 'default'
}
}
package.json
{
"name": "@liyongning/lyn-comp-lib",
"version": "1.0.0",
"description": "从 0 到 1 搭建组件库",
"main": "lib/lyn-comp-lib.common.js",
"scripts": {
"build:commonjs2": "webpack --config webpack.common.js",
"build:umd": "webpack --config webpack.umd.js",
"build": "npm run build:commonjs2 && npm run build:umd"
},
"keywords": ["组件库", "0 到 1"],
"author": "Li Yong Ning",
"files": [
"lib",
"package.json"
],
"repository": {
"type": "git",
"url": "https://github.com/liyongning/lyn-comp-lib.git"
},
...
}
объяснять
- name
Добавьте свое собственное имя учетной записи npm перед именем пакета и используйте метод области действия npm.Организация каталога пакета отличается от организации обычных пакетов, и это может эффективно избежать конфликтов с именами пакетов других людей.
- main
Сообщите потребителю ( import hello from '@liyongning/lyn-comp-lib' ), где загрузить библиотеку компонентов
- script
команда сборки
- files
При публикации пакета npm скажите издателю, чтобы он загружал на сервер npm только те файлы и каталоги, которые указаны в файлах.
- repository
Адрес репозитория кода, этот параметр не является обязательным, его можно не указывать, но обычно он указывается и передается другим пользователям.
Создайте скрипт публикации publish.sh
Сценарий оболочки, отвечающий за создание библиотеки компонентов и публикацию библиотеки компонентов в npm.
#!/bin/bash
echo '开始构建组件库'
npm run build
echo '组件库构建完成,现在发布'
npm publish --access public
README.md
Необходимый файл для проекта, readme.md, отвечает за то, чтобы рассказать другим, как использовать нашу библиотеку компонентов.
построить, опубликовать
На данный момент, не случайно, цель, поставленная в начале, близится к завершению, затем выполните скрипт, соберите и опубликуйте библиотеку компонентов, конечно, вы должны иметь свою собственную учетную запись npm перед публикацией
sh publish.sh
Если во время выполнения скрипта не сообщается об ошибке, а в конце появляется следующее содержимое, это означает, что пакет npm был успешно опубликован.Вы также можете перейти кофициальный сайт нпмПроверить
...
npm notice total files: 5
npm notice
+ @liyongning/lyn-comp-lib@1.0.0
тестовое задание
Затем мы создаем новый тестовый проект, чтобы фактически использовать только что выпущенную библиотеку компонентов, чтобы проверить, доступна ли она и достигает ли она наших ожидаемых целей.
Новый проект
-
Инициализировать каталог проекта
mkdir test && cd test && npm init -y && npm i webpack webpack-cli -D && npm i @liyongning/lyn-comp-lib -SПроверьте журнал или package.json. Вы обнаружите, что библиотека компонентов была успешно установлена, и следующим шагом будет ее использование.
-
Новый /src/index.js
import { hello } from '@liyongning/lyn-comp-lib' console.log(hello('lyn comp lib')) -
Построить
npx webpack-cli --mode developmentВ каталоге /dist будет сгенерирован упакованный файл mian.js, затем создайте новый файл index.html в каталоге /dist и импортируйте main.js, затем откройте его в браузере, откройте консоль, и вы найдете следующий вывод:
-
Загружать ли по запросу
Мы ввели и использовали метод hello только в /src/index.js и искали в main.js.
hello functionа такжеlog functionВы обнаружите, что можете найти его, указав, что теперь он полностью импортирован, а затем загрузить его по запросу в соответствии с конфигурацией документа об использовании (README.md).На этом рисунке также видно, что импорт представляет собой пакет commonjs, а не "./node_modules/@liyongning/lyn-comp-lib/lib/hello.js".
-
Загрузка по требованию настраивается в соответствии с документацией по использованию библиотеки компонентов.
Установить
babel-plugin-componentУстановить
babel-loader、@babel/corenpm install --save-dev babel-loader @babel/core// webpack.config.js const path = require('path') module.exports = { entry: './src/index.js', mode: 'development', output: { path: path.resolve(__dirname, './dist'), filename: 'main.js' }, module: { rules: [ { test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader' } ] } }Установить
@babel/preset-env{ "presets": ["@babel/preset-env"], "plugins": [ [ "component", { "libraryName": "@liyongning/lyn-comp-lib", "style": false } ] ] }
6. 配置 package.json 的 script
```json
{
...
scripts: {
"build": "webpack --config webpack.config.js"
}
...
}
-
выполнить команду сборки
npm run build -
Повторите шаг 4 выше, вы обнаружите, что упакованный файл только
hello function,нетlog functionИ фактический размер упаковки также меньше
Хорошо, цель достигнута! ! Если у вас есть какие-либо вопросы, пожалуйста, задавайте вопросы и продвигайтесь вперед вместе
Связь
Всем спасибо:подобно,собиратьа такжеКомментарий, увидимся в следующий раз.
Когда обучение становится привычкой, знание становится здравым смыслом, отсканируйте код и подпишитесь на общедоступную учетную запись WeChat, чтобы учиться и развиваться вместе. Статьи были включены вgithub, Добро пожаловать в Watch and Star.