browser
VS module
VS main
используется во фронтенд-разработкеnpm
Упаковка, которую можно считать банальной, и использованиеnpm
Пакет всегда на связиpackage.json
Файл конфигурации пакета.
Тогда здесь есть проблема, когда мы находимся в разных средахimport
Одинnpm
пакет, что загружается в концеnpm
Какой файл пакета?
Старые водители быстро дали ответ:main
Файл, указанный в поле.
Однако мы знаемnpm
Пакет фактически делится на:
- Разрешено только на стороне клиента,
- Разрешено использовать только серверу,
- Можно использовать как браузер/сервер.
Если нам нужно разработатьnpm
Пакет совместим как с веб-, так и с серверной частью,Различные входные файлы для пакетов npm необходимо загружать в разных средах., очевидно,main
Поле уже не может удовлетворить наши потребности, которые выводятсяmodule
а такжеbrowser
поле.
В этой статье будут рассмотрены сценарии использования этих полей и приоритет между ними, когда эти поля существуют одновременно.
приоритет файла
говорящийpackage.json
Перед этим поговорим о приоритете файла
Поскольку мы используем две спецификации модуля, ESM и commonJS, для собственного выполнения файлов сценариев спецификации ESM в среде узла,.mjs
Файл появился.
когда естьindex.mjs
а такжеindex.js
Когда такие файлы с одинаковым именем и разными суффиксами,import './index'
илиrequire('./index')
будет загружен первымindex.mjs
файл.
То есть приоритетmjs
> js
browser
,module
а такжеmain
поле
определение поля
-
main
: Определенныйnpm
Входной файл пакета, можно использовать как среду браузера, так и среду узла. -
module
: Определениеnpm
Входной файл спецификации ESM пакета, который можно использовать как в среде браузера, так и в среде узла. -
browser
: Определениеnpm
Входной файл, упакованный в среде браузера
Сценарии использования и приоритеты
Во-первых, мы предполагаемnpm
Мешокtest
имеет следующую структуру каталогов
----- lib
|-- index.browser.js
|-- index.browser.mjs
|-- index.js
|-- index.mjs
в*.js
файлы используют синтаксис спецификации commonJS (require('xxx')
),*.mjs
это синтаксис спецификации ESM (import 'xxx'
)
Его файл package.json:
"main": "lib/index.js", // main
"module": "lib/index.mjs", // module
// browser 可定义成和 main/module 字段一一对应的映射对象,也可以直接定义为字符串
"browser": {
"./lib/index.js": "./lib/index.browser.js", // browser+cjs
"./lib/index.mjs": "./lib/index.browser.mjs" // browser+mjs
},
// "browser": "./lib/index.browser.js" // browser
Согласно приведенной выше конфигурации, то на самом деле нашpackage.json
Указанная запись может иметь
main
module
browser
browser+cjs
browser+mjs
эти 5 случаев.
Конкретные сценарии использования описаны ниже.
webpack + web + ESM
Это наш самый распространенный вариант использования,webpack
Для упаковки и сборки нашего веб-приложения синтаксис модуля использует ESM.
когда мы загружаем
import test from 'test'
Фактический приоритет загрузкиbrowser
= browser+mjs
> module
> browser+cjs
> main
То есть webpack будет искать файл, указанный в поле, в соответствии с этим порядком, пока не найдет его.
Однако реальная ситуация может оказаться более сложной.Подробности см. в блок-схеме.
webpack + web + commonJS
const test = require('test')
На самом деле, при создании веб-приложений используйтеESM
илиcommonJS
Спецификация модуля не влияет на приоритет загрузки
приоритет по-прежнемуbrowser
= browser+mjs
> module
> browser+cjs
> main
webpack + node + ESM/commonJS
Мы знаем, что при создании проекта с помощью веб-пакетаtargetВариант, по умолчанию — web, то есть для сборки веб-приложения.
Когда нам нужно построить некоторые изоморфные проекты или другие проекты узлов, нам нужноwebpack.config.js
изtarget
параметры установлены наnode
строить.
import test from 'test'
// 或者 const test = require('test')
Приоритет:module > main
node + commonJS
пройти черезnode test.js
Выполнить скрипт напрямую
const test = require('test')
Допустимо только основное поле.
node + ESM
пройти через--experimental-modules
Сценарий, который позволяет узлу выполнять спецификацию ESM (должен быть суффикс файла mjs)
`node --experimental-modules test.mjs
import test from 'test'
Допустимо только основное поле.
Суммировать
- если
npm
Пакет экспортирует пакет спецификации ESM, используя модуль - если
npm
Пакет используется только на веб-стороне, и строго запрещено использовать его на стороне сервера, использовать браузер. - если
npm
Пакет используется только на стороне сервера, используйте main - если
npm
И браузер, и основной - Другие более сложные случаи, такие как
npm
Пакет должен предоставить несколько файлов кода с несколькими спецификациями, такими как commonJS и ESM, см. приведенные выше сценарии использования или блок-схемы.
Эта статья была впервые опубликована вблог на гитхабе
Если статья будет вам полезна,твоя звездамоя самая большая поддержка
Другие статьи:
Реклама в потоке:
Шэньчжэнь Shopee долгосрочное внутреннее продвижение
Позиция: front-end, back-end (to go), продукт, UI, тестирование, Android, IOS, эксплуатация и обслуживание — все требуется.
Зарплата и льготы: 20K-50K😳,7:00 выходной 😏, Бесплатные фрукты😍, Бесплатный ужин😊, 15 дней ежегодного отпуска👏, 14 дней оплачиваемого больничного.Справочник по деталям работы.PS: Если вы голосуете онлайн, вы не можете нажать внутрь.
Отправить резюме по адресу:chenweiyu6909@gmail.comИли добавьте меня в WeChat: cwy13920